docker

笔记分享:
基础篇: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

docker_第1张图片

// 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:镜像
. # 当前目录

image.png

六、Dockerfile

dockerfile是用来构建docker镜像的文件,命令参数脚本。
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHUb、阿里云)

Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件。
Docker镜像逐渐成为企业交付的标准。
步骤:
Dockerfile:构建文件,定义了一切的步骤,源代码。
DockerImages:通过Dockerfile构建生成的镜像,最终发布和运行的产品。
DockerContainer:容器就是镜像运行起来的服务器。

Dockerfile命令

docker_第2张图片
docker_第3张图片

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<[email protected]>

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
image.png
# 编写Dockerfile脚本

FROM centos
MAINTAINER albinguo<[email protected]>
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

docker_第4张图片

# 在volume01中创建一个文本
cde volume01
touch test.txt
# 进入docker02容器
docker attach e6fd7c6bb95c
cd volume01
# 可以能看到test.txt文件已经同步过来

即使删除了docker01容器数据也不会丢失
docker_第5张图片

多个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网段下,这样不同网段下的容器就可以通信了

如图
docker_第6张图片

docker_第7张图片

docker_第8张图片

# 将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!

八、Docker Compose

九、Docker Swarm

十、CI/CD Jenkins

你可能感兴趣的:(docker)