笔记分享:
根底篇:https://blog.csdn.net/Mr_YanM…
进阶篇:https://blog.csdn.net/Mr_YanM…
一、Docker 概述
二、Docker 装置
# 卸载旧版本 docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 所需的安装包
yum install -y yum-utils
# 设置镜像仓库
yum-config-manager \
--add-repo \
http://download.docker.com/linux/centos/docker-ce.repo
# 阿里云镜像
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新软件包索引
yum makecache fast
# 装置 docker docker-ce 社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 启动 docker
systemctl start docker
# 查看是否装置胜利
docker version
## 卸载 docker
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源【/var/lib/docker 是 docker 的默认资源门路】rm -rf /var/lib/docker
三、Docker 命令
docker version // 显示 docker 的版本信息
docker info // 显示 docker 的零碎信息,包含镜像和容器的数量
3.1 镜像命令
docker images --help
docker images -a
docker images -q
docker images -aq
docker search --help
// 过滤
docker search mysql --filter=STARS=3000
docker pull mysql:5.7 // 下载 mysql5.7 镜像
// 删除镜像
docker rmi -f 镜像 id
// 删除多个镜像
docker rmi -f 镜像 id 镜像 id 镜像 id
// 删除所有镜像
docker rmi -f $(docker images -aq)
3.2 容器命令
// 拉取 centos 镜像
docker pull centos
// 新建容器并启动
docker run [可选参数] centos
// 参数阐明
--name="名字" // 容器名称
-d // 后盾运行
-it // 进入容器
-p // 指定容器的端口 -p 8080:8080
-p 宿主机端口: 容器端口
// 列出所有正在运行的容器
docker ps
-a // 所有容器
-q // 只显示容器编号
// 删除指定容器
docker rm 容器 id // 不能删除正在运行的容器
// 删除所有容器
docker rm -f $(docker ps -aq)
// 退出容器
exit // 间接进行容器并退出
Ctrl + P + Q // 容器不进行退出
// 启动和进行容器
docker start 容器 id
docker restart 容器 id
docker stop 容器 id
docker kill 容器 id // 强制进行
3.3 操作命令[操作日志 - 元数据 - 过程]
// 查看日志
docker log -f -t --tail 容器 id
-tf // 显示日志
--tail number // 要显示的日志条数
// 查看容器中的过程信息
docker top 容器 id
// 查看镜像的元数据
docker inspect 容器 id
// 进入以后正在运行的容器
// 进入容器开启一个新的终端
docker exec -it 容器 id /bin/bash
// 进入容器正在执行的终端,不会启动新过程
docker attach 容器 id
// 从容器内拷贝文件到宿主机
docker cp 容器 id:/home/test.java /home
四、Docker 镜像
docker commit -m="形容" -a="作者" 容器 id 指标镜像名:[TAG]
docker images // 就能够查看到自定义的镜像
五、容器数据卷
// 同步 centos 容器内的 home 目录到宿主机 /home/ceshi 目录
docker run -it -v /home/ceshi:/home centos /bin/bash
// 查看挂在是否胜利
docker inspect 容器 id
// mysql
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d // 后盾运行
-p // 端口映射
-v // 挂载数据卷
-e // 环境配置
--name // 容器名称
具名和匿名挂载
docker volume ls
// 匿名挂载
local 3c130e08d1a1421c8ae858f509aead83ab0707878a53255428f3cb57f409e62b
// 具名挂载,通过 -v 卷名: 容器内门路
-P 随机端口映射
docker run -d -P --name nginx001 -v juming-nginx:/etc/nginx nginx
// 查看挂在卷
docker volume ls
// 通过具名查找卷
docker volume insepect juming-nginx
# 通过【-v 容器内门路:ro rw】扭转读写权限
ro readonly # 只读
rw readwrite # 只写
# 一旦这个设置了容器权限,容器对咱们挂在进去的内容就有了限定
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
# ro 只有看到 ro 就阐明这个门路只能通过宿主机操作,容器外部是无奈操作的。
# 应用 Dockerfile 挂载卷
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-------end-------"
CMD /bin/bash
# 创立镜像
docker build -f dockerfile1 -t sxakgs/centos .
-f # 指 dockerfile 地址
-t # target: 镜像
. # 当前目录
六、Dockerfile
dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。
构建步骤:
1、编写一个 dockerfile 文件
2、docker build 构建一个镜像
3、docker run 运行镜像
4、docker push 公布镜像(DockerHUb、阿里云)Dockerfile 是面向开发的,咱们当前要公布我的项目,做镜像,就须要编写 dockerfile 文件。
Docker 镜像逐步成为企业交付的规范。
步骤:
Dockerfile:构建文件,定义了所有的步骤,源代码。
DockerImages:通过 Dockerfile 构建生成的镜像,最终公布和运行的产品。
DockerContainer:容器就是镜像运行起来的服务器。
Dockerfile 命令
FROM # 根底镜像,所有从这里开始构建
MAINTAINER # 镜像是谁写的,姓名 + 邮箱
RUN # 镜像构建时须要运行的命令
ADD # 步骤:tomcat 镜像,这个镜像压缩包(主动解压),增加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动时候要运行的命令,只有最初一个会失效,可被代替
ENTRYPOINT # 指定这个容器启动时候要运行的命令,能够追加命令
ONBUILD # 当构建一个被继承的 Dockerfile, 这个时候就会运行 ONBUILD 命令,触发指令
COPY # 相似 ADD,将咱们的文件 copy 到镜像中
ENV # 构建的时候设置环境变量
Dockerfile 实战一
# 编写 dockerfile
[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfile
FROM centos
MAINTAINER albinguo<888888@qq.com>
ENV MYPATH=/usr/local
# 工作目录,进入容器之后间接就到该目录
WORKDIR $MYPATH
# 装置 vim
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "---------------end----------"
CMD /bin/bash
# 通过 docker build 构建镜像
docker build -f dockerfile -t mycentos:1.0 .
Dockerfile 实战二(CMD 和 ENTRYPOINT 的区别)
CMD 命令
# Dockerfile - ENTRYPOINT 命令
[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfile-cmd
FROM centos
ENTRYPOINT ["ls","-a"]
# 最终命令追加为["ls","-a","-l"]
docker run -it docker-cmd-test -l
# Dockerfile - CMD 命令
[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfile-cmd
FROM centos
CMD ["ls","-a"]
# - l 命令报错,因为 - l 替换了 ["ls","-a"] 命令,- l 未找到
docker run -it docker-cmd-test -l
Dockerfile 实战三 – 自定义 Tomcat 镜像
下载 jdk 和 tomcat
# 编写 Dockerfile 脚本
FROM centos
MAINTAINER albinguo<8888888@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
# 构建 Tomcat 镜像(如果你的脚本名称是 Dockerfile,那么就不必再去指定 -f 文件名)
docker build -t diytomcat .
# 查看镜像
docker images
# 运行镜像
docker run -d -p 9090:8080 guo-tomcat -v /home/guo/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /usr/guo/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat
# 进入容器
docker exec -it 容器 id /bin/bash
#测试(拜访胜利)curl localhost:9090
公布镜像
Dockerhub
阿里云镜像仓库
容器间数据同步(–volumes-from)
# 查看镜像 sxakgs/centos
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sxakgs/centos latest cbf93e9f8437 45 minutes ago 231MB
# 生成容器 docker01
docker run -it --name docker01 sxakgs/centos
# 生成容器 docker02 (docker02 继承 docker01)
docker run -it --name docker02 --volumes-from docker01 sxakgs/centos
# 查看容器
docker ps
docker01
docker02
# 进入容器 docker01
docker attach 706baef1fb00
# 在 volume01 中创立一个文本
cde volume01
touch test.txt
# 进入 docker02 容器
docker attach e6fd7c6bb95c
cd volume01
# 能够能看到 test.txt 文件曾经同步过去
即便删除了 docker01 容器数据也不会失落
多个 mysql 实现数据共享
# mysql01
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib
/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# mysql02
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
七、Docker 网络
# 容器之间是能够 ping 通的
docker exec -it tomcat02 ping 172.18.0.2
Docker 中的所有网络接口都是虚构的,虚构的转发效率高(内网传递文件)
只有容器删除了,对应的网桥就没有了
容器互联
场景:咱们编写了一个微服务,database url=ip,我的项目不重启,然而数据库 ip 换了,咱们心愿能够解决这个问题,能够应用服务名来进行容器拜访。
Link – 容器互联
docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
如何解决?docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02(反向不能 ping 通)ping success
自定义网路 – 容器互联
# 网络模式
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
efa36e734234 bridge bridge local
5fa10a79855c host host local
c5c9922cadd7 none null local
[root@iZbp14dzrpdjklcu26tp66Z /]#
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6",
"Created": "2022-07-09T12:54:37.983610057+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]
# 自定义网路
# --driver bridge
# -- subnet 192.168.0.0/16 - 范畴 - 192.168.0.2 到 192.168.255.255
# -- 网关 192.168.0.1
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
efa36e734234 bridge bridge local
5fa10a79855c host host local
59699da6f528 mynet bridge local
c5c9922cadd7 none null local
[root@iZbp14dzrpdjklcu26tp66Z /]#
# 构建两个 tomcat 容器,将容器放入自定义网络中,而后容器之间就能够间接互通了
[root@iZbp14dzrpdjklcu26tp66Z /]# docker run -d -P --name tomcat-net-01 --net mynet 451d25ef4583
9e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2
[root@iZbp14dzrpdjklcu26tp66Z /]# docker run -d -P --name tomcat-net-02 --net mynet 451d25ef4583
d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6",
"Created": "2022-07-09T12:54:37.983610057+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"9e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2": {"Name":"tomcat-net-01","EndpointID":"0c3f6ddfaaf8dbc1799944ff7cb481617d85969e1a98f90e0aa1dafce9079ab0","MacAddress":"02:42:c0:a8:00:02","IPv4Address":"192.168.0.2/16","IPv6Address":""},
"d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5": {
"Name": "tomcat-net-02",
"EndpointID": "58caa7eb08fb20a9a6193580e5c781a56e265691883fd56d6c2f9185f6647451",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}}
]
# 两个容器之间就能够互通了
docker exec -it tomcat-net-01 ping tomcat-net-02
不同网络下的容器互联
tomcat01 和 tomcat02 属于 docker0(bridge)网段下,tomcat-net-01 和 tomcat-net-02 属于自定义网络 mynet 下。不同网段下的容器不能互通。
咱们能够将 docker0 网段下的容器连贯到 mynet 网段下,这样不同网段下的容器就能够通信了
如图
# 将 tomcat02 退出到 mynet 网段下(这样 tomcat02 容器就领有两个 IP)
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network connect mynet tomcat02
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6",
"Created": "2022-07-09T12:54:37.983610057+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"30c27f4629b4b44b00cfe1947c42af3c119aa9ebf84d08ae48ea090c5815b938": {"Name":"tomcat02","EndpointID":"5d450bbf4f65dc682b43945475262f3a75a81a63ec345200ae977ea2f608ce2e","MacAddress":"02:42:c0:a8:00:04","IPv4Address":"192.168.0.4/16","IPv6Address":""},
"9e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2": {
"Name": "tomcat-net-01",
"EndpointID": "0c3f6ddfaaf8dbc1799944ff7cb481617d85969e1a98f90e0aa1dafce9079ab0",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""},"d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5": {"Name":"tomcat-net-02","EndpointID":"58caa7eb08fb20a9a6193580e5c781a56e265691883fd56d6c2f9185f6647451","MacAddress":"02:42:c0:a8:00:03","IPv4Address":"192.168.0.3/16","IPv6Address":""}
},
"Options": {},
"Labels": {}}
]
测试 ping
docker exec -it tomcat-net-01 ping tomcat02
ping success!