核心概念
Docker 镜像
Docker 镜像类似于虚拟机镜像,可以理解为一个只读的模板。镜像是创建Docker容器的基础。
Docker 容器
Docker 容器类似于一个轻量级的沙箱,Docker 利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例。他可以启动、开始、停止、删除,而这些容器都是彼此相互隔离、互不可见的。
可以把容器看作一个简易版的 Linux 系统环境以及运行在其中的应用程序打包而成的盒子。
Docker 仓库
Docker 仓库类似于代码仓库,是 Docker 集中存放镜像文件的场所。
Docker 安装
Docker 安装
本次以在 CentOs 环境下安装 Docker 为例:
如果安装了旧版本,需要先卸载。旧版本的 Docker 称为 docker 或者 docker-engine ,卸载命令:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
为了方便添加软件源,以及支持 devicemapper 存储模式,安装如下软件包:
$ sudo yum update
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加 Docker 稳定版本的 yum 软件源:
$ yum -y install yum-utils #安装yum-config-manager命令
$ sudo yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
如果要安装 nightly 或 test 版,执行如下对应的命令:
$ sudo yum-config-manager --enable docker-ce-nightly # 启用nightly, 将--enbale改为disable又可以禁用
$ sudo yum-config-manager --enable docker-ce-test # 启用test
安装最新版本:
$ sudo yum install -y docker-ce
安装指定版本:
$ sudo yum list docker-ce --showduplicates | sort -r # 列出可用版本
$ sudo yum install docker-ce-<VERSION_STRING> # 安装指定版本
最后确认Docker服务启动正常:
$ sudo systemctl start docker #启动docker
如果在 CentOS 中使用 Docker CE 看到下面的这些警告信息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
可以添加内核配置参数以启用这些功能。
$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然后重新加载 sysctl.conf 即可:
$ sudo sysctl -p
卸载 Docker
$ sudo yum remove docker-ce # 卸载docker-ce
$ sudo rm -rf /var/lib/docker # 该目录下的镜像、容器、数据卷、网络等不会自动删除
配置 Docker 服务
更新配置后需要通过systemctl命令来管理Docker服务:
$ sudo systemctl daemon-reload #重新加载配置文件
$ sudo systemctl enable docker #开启开机自动启动
$ sudo systemctl start docker #启动docker
Docker 命令自动补全
# 安装依赖工具bash-complete
yum install -y bash-completion
source /usr/share/bash-completion/completions/docker
source /usr/share/bash-completion/bash_completion
Docker Compose 安装
yum 安装 docker-compose
安装额外依赖包:
yum install -y epel-release
安装 Docker Compose:
yum install -y docker-compose
验证安装:
docker-compose version
pip 安装 docker-compose
安装 pip
yum -y install epel-release
yum -y install python-pip
pip --version
更新 pip
pip install --upgrade pip
安装 docker-compose
pip install docker-compose
查看 docker compose 的版本
docker-compose version
报错处理
pip 安装时出现【fatal error: Python.h: No such file or directory compilation terminated】错误
因为这些库使用了 c 扩展,需要编译,然后又找不到头文件和静态库导致的。编译这些 c 库需要的依赖库由 python dev 提供,安装 python dev 即可:
For yum (CentOS, RHEL...):
sudo yum install python-devel # for python2.x installs
sudo yum install python34-devel # for python3.4 installs
For apt (Ubuntu, Debian...):
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
使用 Docker 镜像
获取镜像 docker pull NAME[:TAG] :
$ docker pull hello-world #获取hello-world镜像
$ docker run hello-world #运行hello-world应用
使用 images 命令列出镜像
使用 docker images 或 docker image ls 命令可以列出本地主机上已有镜像的基本信息。
使用 tag 命令添加镜像标签
使用 docker tag 为本地镜像添加新的标签。
$ docker tag hello-world:latest hello-world:1.0
搜索镜像
使用 docker search 命令搜索官方仓库中的镜像。
删除镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像,支持选项包括:
- -f, -force:强制删除镜像
- -no-proune:不要清理未带标签的父镜像
$ docker rmi hello hello-world
$ docker rmi hello hello-world:1.0
清理镜像
使用 docker image prune 命令来清理镜像文件,支持选项包括:
- -a, -all:删除所有无用镜像,不管是临时镜像
- -filter:只清理符合给定过滤器的镜像
- -f, -force:强制删除镜像,而不进行提示
操作 Docker 容器
Docker 容器主要有 create、start、run、wait 和 logs 子命令
查看容器
$ docker ps -a #查看本地所有容器信息
新建容器
使用 docker create 命令来新建一个容器:
$ docker create -it mysql
$ docker ps -a #查看所有容器
启动容器
使用 docker start 命令来启动一个已经创建的容器:
$ docker start af
当用户使用exit命令退出bash进程之后,容器也会自动退出。
新建并启动容器
使用 docker run,等价于先执行 docker create 命令,再执行 docker start 命令。
$ docker run -it mysql /bin/bash
$ docker run -d -it mysql /bin/bash #容器在后台以守护态形式运行
查看容器输出
使用 docker logs CONTAINER ID 命令。
$ docker logs 407388f0cc48 #后跟容器ID
暂停容器
使用 docker pause CONTAINER 命令来暂停一个运行中的容器。
$ docker run --name test --rm -it mysql bash
$ docker pause test
$ docker ps
处于 paused 状态的容器,可以通过 docker unpause 命令来恢复运行状态。
终止容器
使用 docker stop 来终止一个运行中的容器。
处于终止状态的容器,可以通过 docker start 命令来启动。
docker restart 命令会将一个运行态的容器先终止,再重新启动。
进入容器
使用 docker attach 可以进入运行在后台的容器,但当多个窗口同时 attach 到一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行其他操作。
使用 docker exec 可以直接再运行中容器内直接执行任意命令:
$ docker exec -it 2342c2352da6 /bin/bash #进入到刚创建的容器中,并启动一个bash
删除容器
使用 docker rm 命令来删除处于终止或退出状态的容器
数据卷
创建数据卷
可以使用 docker volume create 数据卷名称的命令来创建一个数据卷
$ docker volume create volume1
查看数据卷
创建完后,这个数据卷具体对应宿主机哪个文件目录在上面是没法得知的,可以通过 docker volume inspect 数据卷名称来查看
$ docker volume inspect volume1
[
{
"CreatedAt": "2019-08-12T19:43:47+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/volume1/_data",
"Name": "volume1",
"Options": {},
"Scope": "local"
}
]
可以通过 docker volume ls 命令来查看所有数据卷
$ docker volume ls
DRIVER VOLUME NAME
local volume1
使用数据卷
可以在启动容器时通过 -v 或 –mount 的方式将一个数据卷挂载到容器的某个目录
$ docker run -dit --name ubuntu1 -v volume1:/vol1 ubuntu:18.04
按照 -v 数据卷名:容器目录 的格式,也可以使用 –mount 按照 --mount source = 数据卷名(主机目录),target = 容器目录的格式,如我们再启动一个挂载相同数据卷的容器 ubuntu2
$ docker run -dit --name ubuntu2 --mount source=volume1,target=/vol2 ubuntu:18.04
删除数据卷
数据卷不会随着容器的删除而自动删除。如果一个数据卷还被某个容器使用,则不能删除;如果一个数据卷只被一个容器使用,则可在删除容器时通过指定 -v 参数同时删除其挂载的数据卷;
$ docker rm -v ubuntu3
可以通过 docker volume rm 数据卷名称 来删除某个数据卷;
可以通过 docker volume prune 清理掉所有未被任何容器使用的数据卷。
创建使用指定卷的容器
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:
# docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx #需要前置创建名为edc-nginx-vol的数据卷
其中,-v 代表挂载数据卷,这里使用自定数据卷 edc-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是 yum 安装 nginx 的默认网页目录)。
如果没有通过 -v 指定,那么 Docker 会默认帮我们创建匿名数据卷进行映射和挂载。
使用卷创建一个容器
# docker run -d -it --name=edc-nginx -v /www/wwwroot:/usr/share/nginx/html nginx
这里指定了将宿主机上的 /www/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是 yum 安装 nginx 的默认网页目录)。