一、基礎(chǔ)
- docker是使用Go語言在Linux上是基于Linux內(nèi)核的cgroup,namespace,以及AUFS類的Union FS等技術(shù)實(shí)現(xiàn)的容器。
- 管理命令
#啟動(dòng)
systemctl enable docker
systemctl start docker
#查看信息
docker info
#查看幫助
docker --help
二、鏡像
- 可以看做一個(gè)根文件系統(tǒng)
- 倉庫:一般使用如userName/ubuntu:14.04標(biāo)識(shí)倉庫中的鏡像
- 管理命令
#拉取鏡像
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]鏡像名稱[:標(biāo)簽]
#列出鏡像,IMAGE ID是唯一的
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 2cb0d9787c4d 13 days ago 1.85kB
#刪除本地鏡像
docker image rm imageid
#查看鏡像詳情
docker image inspect nginx:1.12
#鏡像導(dǎo)出導(dǎo)入
docker image save eb40dcf64078> /root/mydjango-save-1016.tar
docker image load < /root/mydjango-save-1016.tar
- Dockerfile
FROM debian:jessie #指定基礎(chǔ)鏡像
RUN apt-get install -y gcc libc6-dev make #或RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
COPY package.json /usr/src/app/ #從上下文目錄中復(fù)制到目標(biāo)目錄;或COPY ["<源路徑1>",... "<目標(biāo)路徑>"]
WORKDIR <工作目錄路徑> #指定工作目錄
USER <用戶名> #指定當(dāng)前用戶
ENV NODE_VERSION 7.2.0 #定義環(huán)境變量
VOLUME ["<路徑1>", "<路徑2>"...] #定義匿名數(shù)據(jù)卷,會(huì)自動(dòng)關(guān)聯(lián)到主機(jī)某個(gè)目錄;或VOLUME <路徑>
EXPOSE <端口1> [<端口2>...] #開放端口
CMD <命令> #容器啟動(dòng)后默認(rèn)執(zhí)行的命令(容器中無systemd概念),會(huì)被commad覆蓋,只能出現(xiàn)一次;或CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ] #如果定義了接入點(diǎn),那么執(zhí)行到CMD時(shí),CMD含義變?yōu)樘峁﹨?shù),只能出現(xiàn)一次
#docker build -t nginx:v3 .:通常在空目錄中放置Dockerfile,表示在上下文目錄中構(gòu)建鏡像
三、容器
- 實(shí)質(zhì)上即進(jìn)程
- 管理命令
#運(yùn)行鏡像
#-d:容器后臺(tái)運(yùn)行
#-m:限制最大內(nèi)存量
#-cpus:限制最大cpu量
docker container run [options] image [commad] [arg...]
#啟動(dòng)停止?fàn)顟B(tài)的容器
docker container start myrunoob
#列出容器
docker container ls
#進(jìn)入容器
#退出容器:exit
docker container exec -it 69d1 bash
#刪除容器
docker container rm myrunoob
docker container rm $(docker ps -aq)
#查看容器詳情
docker container inspect web
- 數(shù)據(jù)管理
#創(chuàng)建數(shù)據(jù)卷
docker volume create my-vol
#查詢所有數(shù)據(jù)卷
docker volume ls
#查看數(shù)據(jù)卷信息
docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
#啟動(dòng)容器時(shí)掛載數(shù)據(jù)卷
docker run -d -P \
--name web \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py
#刪除數(shù)據(jù)卷
docker volume rm my-vol
#直接綁定主機(jī)目錄
docker run -d -P \
--name web \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
- 網(wǎng)絡(luò)管理
- 支持的網(wǎng)絡(luò)模式
- bridge:默認(rèn)的,限本主機(jī),可以通過容器名發(fā)現(xiàn)容器
- Overlay:跨主機(jī),需滿足以下任一條件
- docker運(yùn)行在Swarm模式中
- docker引擎都連接到consul等上
- 管理命令
#-P:Docker會(huì)隨機(jī)映射一個(gè)49000~49900的端口到容器開放的端口
docker run -d -P training/webapp python app.py
#-p:指定映射端口到容器端口
docker run -d -p 5000:5000 training/webapp python app.py
#查看容器的端口映射配置
docker port nostalgic_morse 5000
#創(chuàng)建網(wǎng)絡(luò)
docker network create -d overlay multi_host
#查看網(wǎng)絡(luò)
docker network ls
#移除網(wǎng)絡(luò)
docker network rm multi_host
四、Docker Compose
- 定義和運(yùn)行多個(gè) Docker 容器的官方開源項(xiàng)目;用Python編寫,調(diào)用Docker服務(wù)提供的API實(shí)現(xiàn)
- 管理的單元
- 服務(wù)(service):一個(gè)應(yīng)用容器
- 項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元
# 管理的單元配置文件,默認(rèn)docker-compose.yml
version: "3"
services:
db:
image: mysql:5.7
# 或者通過build指定Dockerfile的方式
#build:
# context: ./dir
# dockerfile: Dockerfile-alternate
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
data:
#instead of attempting to create a volume called [projectname]_data, Compose looks for an existing volume simply called data and mount it into the db service’s containers
external: true
- 管理命令
#一般命令格式
#-f:指定模板文件,默認(rèn)當(dāng)前目錄下docker-compose.yml
#-p:指定項(xiàng)目名稱,默認(rèn)當(dāng)前目錄名為項(xiàng)目名
docker-compose [options] [COMMAND] [ARGS...]
#啟動(dòng)compose
docker-compose up
五、Docker Machine
- 負(fù)責(zé)在多種平臺(tái)上快速安裝Docker環(huán)境的官方開源項(xiàng)目
- 管理命令
#創(chuàng)建一臺(tái) Docker 主機(jī)
docker-machine create -d virtualbox test
#通過 SSH 登錄到主機(jī)
docker-machine ssh test
六、Docker Swarm
- Swarm是Docker內(nèi)置的Docker主機(jī)集群管理工具
- 運(yùn)行 Docker 的主機(jī)可以主動(dòng)初始化一個(gè) Swarm 集群或者加入一個(gè)已存在的 Swarm 集群,這樣這個(gè)運(yùn)行 Docker 的主機(jī)就成為一個(gè) Swarm 集群的節(jié)點(diǎn) ( node )
- 節(jié)點(diǎn)分為管理 ( manager ) 節(jié)點(diǎn)和工作 ( worker ) 節(jié)點(diǎn),管理節(jié)點(diǎn)默認(rèn)也作為工作節(jié)點(diǎn)
- 管理命令
#本地初始化一個(gè)Swarm集群,默認(rèn)是管理節(jié)點(diǎn)
#如果你的 Docker 主機(jī)有多個(gè)網(wǎng)卡,擁有多個(gè) IP,必須使用 --advertise-addr 指定 IP
$docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#創(chuàng)建一個(gè)docker主機(jī)并加入Swarm集群
$docker-machine create -d virtualbox worker1
$docker-machine ssh worker1
docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
#查看集群
docker node ls
#向集群中部署服務(wù)
#部署后我們使用瀏覽器,輸入任意節(jié)點(diǎn) IP ,即可看到 nginx 默認(rèn)頁
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
#查看服務(wù)
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#查看服務(wù)詳情
docker service ps
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago
36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago
#刪除服務(wù)
docker service rm
- 使用docker-compose.yml
#配置文件一般如下:
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
visualizer: #提供可視化界面服務(wù)
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:
#部署服務(wù)
docker stack deploy -c docker-compose.yml wordpress
#查看服務(wù)
docker stack ls
#移除服務(wù)
docker stack down