Docker入門與實踐

作者:方誌朋
來源:方誌朋(ID:walkingstory)

Docker簡介

Docker是容器技術的一個代表,容器的技術從本質上講是程序打包、隔離的技術,不是一個很新的技術,核心的技術在內核中已經存在很久了。但容器技術被大眾所用,變成這麼流行,這麼火爆的技術是因為Docker。Docker在13年被開源,變得越來越流行,Docker在微服務領域、雲計算領域有著廣泛的應用。這是為什麼呢。任何技術的流行可能的原因有兩點,一是能夠解決大家的痛點,二是能夠能夠適應潮流.docker理順了軟件包的問題,有了docker運行一個鏡像是非常容易的,不需要做各種環境的配置。

什麼是Docker?官方的解釋如下:

an open resource project to pack,ship and run any application as a lightweght containner.
Build, Manage and Secure Your Apps Anywhere. Your Way.

可以粗糙的認為是一個輕量級的虛擬機,因為在某種程度上來講,docker和虛擬機是有非常多的相似點。它們都是講應用放在相對獨立的環境裡,調度主機的內核來運行。但Docker確實不是虛擬機,這張圖是虛擬機和Docker的對比圖,左邊這張圖是虛擬機,右邊是Docker,左邊的虛擬機子宿主機上有一層Hypervisor虛擬層,虛擬出了硬件和設備,在虛擬層上面會安裝GuestOs,然後再運行各種各樣的程序,docker 是不一樣的,docker是不一樣的,它在宿主機上有一個Docker engine,然後再運行各種各樣的應用程序。因為它沒有虛擬機層,它會比虛擬機輕量很多,包括程序運行速度也非常的快。

Docker為何這麼火?天時地利人和。Docker 不是什麼新技術,Docker的鏡像版本管理是其火的根本原因。

Docker安裝

Centos安裝:

安裝:
yum search docker
yum -y install docker-io
查看基本信息:docker info
啟動:servie start docker

Docker架構

Docker入門與實踐


從這張圖可以看出,Docker的架構是非常簡答的。中間是Host,上面裝了一個Docker daemon的守護進程,守護進程應用做很多docker的操作,那麼誰讓 docker daemon來做這些操作呢,是最左邊client,比如我們再終端操作輸入dokcer的命令,客戶端講命令發送給docker守護進程,讓docker去做一些操作,比如從最右邊的鏡像倉庫拉取鏡像到宿主機上,然後在宿主機上跑鏡像,運行容器。

常見的Docker命令

docker run -p 80:80 -d docker.io/nginx
docker cp index.html containerId://usr/share/nginx/html
docker exec -it containeId /bin/bash
docker images
docker ps [-a -q]
docker stop containerId
docker rm containerId
docker rmi imagesId
docker commit –m ’msg’ containerId [name]
docker build
docker pull
docker push
docker login

Dockerfile

常用命令

Docker入門與實踐

如果不理解可以參考博客https://www.cnblogs.com/51kata/category/789766.html

第一個Dockerfile

FROM alpine:latest
MAINTAINER fzp
CMD echo 'hello docker'

這個鏡像的基礎鏡像是alpine:latest,所有者是fzp,容器啟動的時候會執行echo命令。

執行:

docker build -t hello-img .
docker run hello-img

控制檯輸出: hello docker

第二個Dockerfile

FROM ubuntu
MAINTAINER fzp
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

這個鏡像稍微複雜點,基礎鏡像是ubuntu,鏡像所屬者fzp,再一下一層是設置鏡像加速的地址。將index.html拷貝到鏡像的目錄下。最後以前臺進程的形式啟動。

index.html

today i'm happy


執行命令:

docker build -t forezp/hello.nginx .
docker run forezp/hello.nginx

curl localhost

控制檯輸出:today i'm happy

Docker存儲

獨立於容器之後的獨立化存儲

第一種方式:

docker run -p 80:80 -d -v $PWD/code:/var/www/html nginx


-v指令 宿主的路徑:容器路徑

將容器的路徑的文件夾或者文件掛載到宿主機的路徑。

第二種方式:

docker run -volumes-from ...

docker create -v $PWD/data:/var/mydata --name data_container ubuntu
docker run -it --volumes-from data_container ubuntu /bin/bash
cd /var/mydata
touch what.txt
exit
cd data
ls

可以查看宿主機的data目錄有what.txt文件

鏡像倉庫

Regiestry,使用官方的docker hub。

docker search whalesay
docker pull dokcer/whalesay
docker run dokcer/whalesay cowsay docker is fun
docker tag dokcer/whalesay forezp/whalesay
dcoker push forezp/whalesay
docker login

Docker Compose

docker compose是Docker 官方的一個容器編排工具,現在以一個簡單的搭建博客的例子來講解。

安裝

所以的例子都是在linux系統下完成的,docker compose在linux下的安裝:

curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

驗證安裝成了沒:

docker-compose --version


Docker Compse常用命令

  • docker-compose build
  • docker-compose up
  • docker-compose stop
  • docker-compose rm

案例實戰

工程架構:

Docker入門與實踐


分為3個容器,最外層一個服務為ngixn,下一層服務為ghost app,最底層容器是Mysql

在工作目錄ghost下,有三個文件夾分別為ngix、ghost、db和一個docker-compose.yml文件,目錄結構為:

-ghost
- nginx
- Dockerfile
- nginx.conf
- ghost
- Dockerfile
- config.js
- db
- docker-compose.yml

docker-compose.yml編寫

version: '2'
networks:
ghost:
services:
ghost-app:
build: ghost
networks:
- ghost
depends_on:
- db
ports:
- "2368:2368"
nginx:
build: nginx
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
db:
image: "mysql:5.7.15"
networks:
- ghost
environment:
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes:
- $PWD/data:/var/lib/mysql
ports:
- "3306:3306"

nginx相關

dockerfile編寫:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

配置文件文件編寫nginx.conf

worker_processes 4;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://ghost-app:2368;
}
}
}

ghost app相關

Dockerfile編寫:

FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368

配置文件config.js:

var path = require('path'),
config;
config = {
production: {
url: 'http://mytestblog.com',
mail: {},
database: {
client: 'mysql',

connection: {
host: 'db',
user: 'ghost',
password: 'ghost',
database: 'ghost',
port: '3306',
charset: 'utf8'
},
debug: false
},
paths: {
contentPath: path.join(process.env.GHOST_CONTENT,'/')
},
server: {
host: '0.0.0.0',
port: '2368'
}
}
};
module.exports = config;

docker-compose打鏡像,打完鏡像之後運行.

docker-compose buid
docker-compose up

運行之後在瀏覽器上訪問:http://119.23.221.204/

顯示界面如下:

Docker入門與實踐


說明

最近在全力學習k8s、paas等技術,如有相似的興趣愛好者,可以加我微信miles02,加你入vip群。

https://www.imooc.com/video/15735


分享到:


相關文章: