Docker安装和使用
官方文档地址:https://docs.docker.com/
一、ContenOS系统上安装Docker
1.卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.设置存储库
// 下载工具包
$ sudo yum install -y yum-utils
// 使用官方源地址(比较慢)
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
// 国内阿里云(推荐)
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 清华大学源
$ sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
3.启用夜间或测试存储库(非必须)
这些存储库包含在上面的文件中,但默认情况下会禁用。您可以在稳定存储库旁边启用它们。以下命令启用夜间存储库。docker.repo
$ sudo yum-config-manager --enable docker-ce-nightly
要启用测试通道,运行以下命令:
$ sudo yum-config-manager --enable docker-ce-test
您可以通过用标志运行命令来禁用夜间或测试存储库。要重新启用它,请使用标志。以下命令禁用夜间存储库。
yum-config-manager--disable--enable
$ sudo yum-config-manager --disable docker-ce-nightly
4.安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
- 列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
- 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:
docker-ce-18.09.1
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
5.启动docker
$ sudo systemctl start docker
6.启动验证
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community
$ sudo docker run hello-world
7.配置镜像加速器
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5seuwveb.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
8.卸载 docker
// 删除安装包:
$ yum remove docker-ce
// 删除镜像、容器、配置文件等内容:
$ rm -rf /var/lib/docker
二、几种修改 Docker 镜像默认存储位置的方法
查看系统版本
$ cat /etc/redhat-release
查看内核信息
$ uname -r
1.使用软链接
我们知道在操作系统当中,默认情况下 Docker 容器的存放位置在 /var/lib/docker 目录下面,可以通过下面命令查看具体位置
# 默认存放位置
$ sudo docker info | grep "Docker Root Dir"
解决默认存储容量不足的情况,最直接且最有效的方法就是挂载新的分区到该目录。但是在原有系统空间不变的情况下,所以采用软链接的方式,修改镜像和容器的存放路径达到同样的目的。
# 停掉Docker服务 $ systemctl restart docker # 停掉Docker服务 $ service docker stop ``` > 然后移动整个 /var/lib/docker 目录到空间不较大的目的路径。这
时候启动 Docker 时发现存储目录依旧是 /var/lib/docker 目录,但是实际上是存储在数据盘 /data/docker 上了。
# 移动原有的内容
$ mv /var/lib/docker /data/docker
# 进行链接
$ ln -sf /data/docker /var/lib/docker
2.指定容器启动参数
在配置文件中指定容器启动的参数
--graph=/var/lib/docker
来指定镜像和容器存放路径。Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致。在 Ubuntu 中的位置是/etc/default/docker
文件,在 CentOS 中的位置是/etc/sysconfig/docker
文件。
# CentOS6
OPTIONS=--graph="/data/docker" --selinux-enabled -H fd://
# CentOS7
# 修改docker.service文件,使用--graph参数指定存储位置
$ vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph=/data/docker
原配置保持不变,添加
–graph=/data/docker
,/data/docker是新的存储位置
以下两个文件均可修改docker配置:
/etc/systemd/system/multi-user.target.wants/docker.service
/usr/lib/systemd/system/docker.service
# Ubuntu
# 因为Ubuntu默认没开启selinux机制
OPTIONS=--graph="/data/docker" -H fd://
将原先目录下所有的文件和目录拷贝到新目录下
$ sudo cp -rf /var/lib/docker/* /data/docker
重新启动之后,Docker 的路径就改成
/data/docker
了。
# 重新reload配置文件
$ sudo systemctl daemon-reload
# 重启docker服务
$ sudo systemctl restart docker.service
如果没有生效,按如下操作
vim /etc/default/docker
# 添加配置信息
DOCKER_OPTS="--graph=/home/docker"
# 保存退出
service docker restart
# 发现配置并没有生效
# 解决方案:
mkdir -p /etc/systemd/system/docker.service.d
cat /etc/systemd/system/docker.service.d/Using_Environment_File.conf
# 如果没有该文件则自行创建,添加以下内容
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS
# 载入配置重启服务
systemctl daemon-reload
service docker restart
# 查看配置是否生效
docker info | grep 'Docker Root Dir'
如果 Docker 的版本是 1.12 或以上的,可以修改或新建 daemon.json 文件。修改后会立即生效,不需重启 Docker 服务。
# 修改配置文件
$ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://5seuwveb.mirror.aliyuncs.com"],
"graph": "/progam/docker"
}
3. System 下创建配置文件
在 /etc/systemd/system/docker.service.d 目录下创建一个 Drop-In 文件 docker.conf,默认 docker.service.d 文件夹不存在,必须先创建它。创建 Drop-In 文件的原因,是我们希望 Docker服务使用 docker.conf 文件中提到的特定参数,将默认服务所使用的位于 /lib/systemd/system/docker.service 文件中的参数进行覆盖。
# 定义新的存储位置
$ sudo vi /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=/usr/bin/dockerd --graph="/data/docker" --storage-driver=devicemapper
保存并退出 vim 编辑器 /data/docker 就是新的存储位置,而 devicemapper 是当前 Docker 所使用的存储驱动。如果你的存储驱动有所不同,请输入之前第一步查看并记下的值。现在,你可以重新加载服务守护程序,并启动 Docker 服务了,这将改变新的镜像和容器的存储位置。为了确认一切顺利,运行 docker info 命令检查 Docker 的根目录。
# 重新reload配置文件
$ sudo systemctl daemon-reload
# 重启docker服务
$ sudo systemctl start docker
三、Docker的常用命令
基本命令详细参考:
https://www.docker.org.cn/dockerppt/106.html
1.帮助命令
// 显示docker的版本信息
$ docker version
// 显示docker的系统信息,包括镜像和容器的数量
$ docker info
// 帮助命令
$ docker [命令] --help
2.镜像命令
// 查看所有本地主机上的镜像
$ docker images
命令可选项
可选项 | 含义 |
---|---|
-a -all | 列出所有镜像 |
-q -quiet | 只显示镜像的id |
名词性解释
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
名称 | 解释 |
---|---|
REPOSITORY | 镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像的id |
CREATED | 镜像创建的时间 |
SIZE | 镜像的大小 |
docker search 搜索镜像
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11120 [OK]
mariadb MariaDB Server is a high performing open sou… 4216 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 825 [OK]
可选项 | 含义 |
---|---|
--filter=STARTS=3000 | 搜索STARTS分数3000以上的 |
docker pull 下载镜像
// 下载mysql5.7版本的镜像
$ $ docker pull mysql:5.7
// 不指定版本默认latest
$ $ docker pull mysql
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Pull complete
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
// 删除指定id的镜像
$ $ docker rmi -f [id] [id]
// 递归删除所有镜像
$ $ docker rmi -f $(docker images -aq)
3.容器命令
首先安装一个容器,来测试学习容器命令
// 下载centos容器
docker pull centos
新建容器并启动
$ docker run [可选参数] image
可选项说明
参数 | 说明 |
---|---|
--name =Name | 容器名字,tomcat01 tomcat02,用来区分容器 |
-d | 后台方式运行 |
-it | 使用交互方式运行,进入容器查看内容 |
-p | 指定容器的端口 -p 主机端口 :容器端口 |
-P | 随机指定端口 |
启动并进入容器
$ docker run -it centos /bin/bash
[root@iZuf60iq1x5h6s5apkzxd3Z /]# docker run -it centos /bin/bash
[root@719b8a4bb125 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
从容器中退回主机
// 容器停止退出
$ exit
// 容器不停止退出
$ ctrl + p + q
[root@719b8a4bb125 /]# exit
exit
[root@iZuf60iq1x5h6s5apkzxd3Z /]# ls
bin dev home lib lost+found mnt patch root sbin sys usr www
boot etc install.sh lib64 media opt proc run srv tmp var
查看当前正在运行的容器
$ docker ps
可选项说明
参数 | 说明 |
---|---|
-a | 列出当前正在运行的容器+带出历史运行过得容器 |
-n =? | 显示最近创建的容器(n :表示数量) |
-q | 只显示容器的编号 |
删除容器
// 删除指定容器
$ docker rm [容器id]
// 递归删除所有容器
$ docker rm -f $(docker ps -aq)
// 删除所有容器
docker ps -a -q | xargs docker rm
启动和停止容器
// 启动容器
$ docker start [容器id]
// 重启容器
$ docker restart [容器id]
// 停止当前正在运行的容器
$ docker stop [容器id]
// 强制停止当前的容器
$ docker kill [容器id]
4.日志、元数据、进程的查看
查看容器日志
$ docker logs [可选参数] [容器id]
可选项 | 说明 |
---|---|
-t | 打印时间格式 |
-f | 保留打印窗口,持续打印 |
-n | --tail | 显示最后n行 |
查看容器中进程信息
$ docker top [容器id]
查看容器的元数据
$ docker inspect [容器id]
5.进入容器的命令和拷贝的命令
进入容器的命令
// 方式1:进入容器后开启一个新的终端,可以在里面操作(常用)
$ docker exec -it [容器id] /bin/bash|/bin/sh
// 方式2:进入容器正常执行的终端,不会启动新的进程
$ docker attach [容器id]
从容器内拷贝文件到主机上
$ docker cp 容器id:容器内路径 主机上路径
四、Docker部署教程
1.Docker内部署Nginx
搜索Nginx容器镜像
$ sudo docker search nginx
下载Nginx镜像
$ sudo docker pull nginx
启动容器
$ sudo docker run -d --name nginx01 -p 3344:80 nginx
查看容器启动情况
$ sudo docker exec -it nginx01
2.Docker内部署Tomcat
下载Tomcat镜像
$ sudo docker pull tomcat:8.5
启动容器
$ sudo docker run -d --name tomcat01 -p 3355:8080 tomcat:8.5
查看容器启动情况
// 查看内容和CPU情况
$ sudo docker stats
// 进入容器内查看
$ sudo docker exec -it tomcat01
3.Docker内部署Elasticsearch
下载Elasticsearch镜像
$ sudo docker pull elasticsearch:7.6.2
启动容器
$ sudo docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=singl-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
查看容器启动情况
$ sudo docker exec -it tomcat01
五、Docker可视化界面管理
Portainer 图形化界面
$ sudo docker run -d -p:8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
六、Docker镜像
什么是镜像?
镜像加载原理
分层思想
容器快照镜像
docker commit
$ sudo docker commit -a="作者信息" -m="提交信息描述" 容器id 新镜像名称:[TAG]
六、容器数据卷
1.什么是容器数据卷
容器数据卷:宿主机器中可以在容器之间进行共享和重用的一系列文件和文件夹。
2.数据卷的作用(为什么要使用)
1.容器的持久化
2.容器间继承、共享数据
3.容器与宿主机之间的数据共享
3.数据卷添加的两种方式
1.命令方式(可以带权限)
$ sudo docker run -it 宿主机目录路径:容器目录路径[:权限] 容器id
2.DockerFile方式
# 1.新建Dockerfile文件,名称任意推荐dockerfile作为前缀
$ sudo vim dockerfile01
# 2.编辑dockerfile01文件,并编写下面命令
FROM 目标镜像 // 设置基础镜像
VOLUME["宿主机上的卷目录路径1", "宿主机上的卷目录路径1" ...] // 设置数据卷挂载路径
CMD echo "--- END ---" // 命令行
CMD /bin/bash // 命令行
# 3.使用docker build命令创建镜像(注:结尾有个`.`)
$ sudo docker build -f dockerfile文件路径 -t 镜像目标路径:[TAG] .
3.具名和匿名挂载
如何确定是匿名挂载还是具名挂载,还是指定路径挂载
$ -v 容器内路径 #匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径
$ -v 卷名:容器内路径 #具名挂载
$ -v 宿主内路径:容器内路径 #指定路径挂载
1.匿名挂载:这里以Nginx为例:
$ sudo docker run -d -P --name nginx01 -v /etc/nginx nginx
//端口映射-p(小写)、-P(大写)区别
-p指定要映射的端口,一个指定端口上只可以绑定一个容器
-P将容器内部开放的网络端口随机映射到宿主机的一个端口上
查看所有volume情况
$ sudo docker volume ls
DRIVER VOLUME NAME
local 4a3daf61b2e4f14edd92eaf84515b82ac863ca945497b5a71642506b88cfea49
local 78a889203c9cd658a64b6bf25870bea2a25a11e127aa48b027d0750f44a7cc78
local 2985c543eadf37ced04f451c8bd056df2032518eab3dc1e00c24766ac2aaf8b5
local c0cf9727552b0df0ebd88919cab016730450a3a1a31f48905c7b88cf2152dd36
local c00400d2fea2d074078b8f20d03c111df306beb6385aeed2d86a101e3b3bfe72
local ce7cc5dac50c58ff44a5f13f84d00e2100fadbcf1fea2788b334854f2e4c1080
local ffe9eafba04a7e2ae4d7e12f1049c47f041a3d6b0eb6bcfa4734f08184cfb460
这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器的路径!
2.具名挂载:就是挂载的卷定义一个自己的名字,可以方便的查找
$ sudo docker run -d -P --name nginx02 -v Bertram:/etc/nginx nginx
$ sudo docker volume ls
DRIVER VOLUME NAME
.....
local Bertram
查看卷所对应的路径
$ sudo docker volume inspect Bertram
[
{
"CreatedAt": "2020-10-19T15:24:58+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/data/docker/volumes/Bertram/_data",
"Name": "Bertram",
"Options": null,
"Scope": "local"
}
]
docker容器内的卷,没有指定目录的情况下都是在
/var/lib/docker/volumes
目录下
我们通过具名挂载可以方便的找到我们的一个卷,大多数使用的都是具名挂载。
3.扩展
# 通过 -v 容器内路径,ro rw改变读写权限
ro readonly #只读
rw readwrite #可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v Bertram:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v Bertram:/etc/nginx:rw nginx
# 只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作。
4.数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
# 1.新建容器nginx01并挂载数据卷Bertram
$ sudo docker run -d -P --name nginx01 -v Bertram:/etc/nginx:ro nginx
# 2.新建容器nginx02并挂载数据卷容器nginx01
$ sudo docker run -d -P --name nginx02 --volumes-from nginx01 nginx
注:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
# 1.删除容器nginx01,nginx02依然可以共享Bertram数据卷
# 2.新建容器nginx03并挂载数据卷容器nginx02
$ sudo docker run -d -P --name nginx03 --volumes-from nginx02 nginx
# 3.删除容器nginx02,这时nginx03可以访问Bertram数据卷