一、基础
- docker是使用Go语言在Linux上是基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术实现的容器。
- 管理命令
#启动
systemctl enable docker
systemctl start docker
#查看信息
docker info
#查看帮助
docker --help
二、镜像
- 可以看做一个根文件系统
- 仓库:一般使用如userName/ubuntu:14.04标识仓库中的镜像
- 管理命令
#拉取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]镜像名称[:标签]
#列出镜像,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
#镜像导出导入
docker image save eb40dcf64078> /root/mydjango-save-1016.tar
docker image load < /root/mydjango-save-1016.tar
- Dockerfile
FROM debian:jessie #指定基础镜像
RUN apt-get install -y gcc libc6-dev make #或RUN ["可执行文件", "参数1", "参数2"]
COPY package.json /usr/src/app/ #从上下文目录中复制到目标目录;或COPY ["<源路径1>",... "<目标路径>"]
WORKDIR <工作目录路径> #指定工作目录
USER <用户名> #指定当前用户
ENV NODE_VERSION 7.2.0 #定义环境变量
VOLUME ["<路径1>", "<路径2>"...] #定义匿名数据卷,会自动关联到主机某个目录;或VOLUME <路径>
EXPOSE <端口1> [<端口2>...] #开放端口
CMD <命令> #容器启动后默认执行的命令(容器中无systemd概念),会被commad覆盖,只能出现一次;或CMD ["可执行文件", "参数1", "参数2"...]
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ] #如果定义了接入点,那么执行到CMD时,CMD含义变为提供参数,只能出现一次
#docker build -t nginx:v3 .:通常在空目录中放置Dockerfile,表示在上下文目录中构建镜像
三、容器
- 实质上即进程
- 管理命令
#运行镜像
#-d:容器后台运行
#-m:限制最大内存量
#-cpus:限制最大cpu量
docker container run [options] image [commad] [arg...]
#启动停止状态的容器
docker container start myrunoob
#列出容器
docker container ls
#进入容器
#退出容器:exit
docker container exec -it 69d1 bash
#删除容器
docker container rm myrunoob
docker container rm $(docker ps -aq)
#查看容器详情
docker container inspect web
- 数据管理
#创建数据卷
docker volume create my-vol
#查询所有数据卷
docker volume ls
#查看数据卷信息
docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
#启动容器时挂载数据卷
docker run -d -P \
--name web \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py
#删除数据卷
docker volume rm my-vol
#直接绑定主机目录
docker run -d -P \
--name web \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
- 网络管理
- 支持的网络模式
- bridge:默认的,限本主机,可以通过容器名发现容器
- Overlay:跨主机,需满足以下任一条件
- docker运行在Swarm模式中
- docker引擎都连接到consul等上
- 管理命令
#-P:Docker会随机映射一个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
#创建网络
docker network create -d overlay multi_host
#查看网络
docker network ls
#移除网络
docker network rm multi_host
四、Docker Compose
- 定义和运行多个 Docker 容器的官方开源项目;用Python编写,调用Docker服务提供的API实现
- 管理的单元
- 服务(service):一个应用容器
- 项目(project):由一组关联的应用容器组成的一个完整业务单元
# 管理的单元配置文件,默认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:指定模板文件,默认当前目录下docker-compose.yml
#-p:指定项目名称,默认当前目录名为项目名
docker-compose [options] [COMMAND] [ARGS...]
#启动compose
docker-compose up
五、Docker Machine
- 负责在多种平台上快速安装Docker环境的官方开源项目
- 管理命令
#创建一台 Docker 主机
docker-machine create -d virtualbox test
#通过 SSH 登录到主机
docker-machine ssh test
六、Docker Swarm
- Swarm是Docker内置的Docker主机集群管理工具
- 运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 ( node )
- 节点分为管理 ( manager ) 节点和工作 ( worker ) 节点,管理节点默认也作为工作节点
- 管理命令
#本地初始化一个Swarm集群,默认是管理节点
#如果你的 Docker 主机有多个网卡,拥有多个 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.
#创建一个docker主机并加入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
#向集群中部署服务
#部署后我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
#查看服务
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#查看服务详情
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
#删除服务
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: #提供可视化界面服务
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:
#部署服务
docker stack deploy -c docker-compose.yml wordpress
#查看服务
docker stack ls
#移除服务
docker stack down