docker

131 阅读27分钟

docker学习

docker官方文档

docker仓库

docker-image
docker通过隔离机制,可以将服务器发挥到极致

docker十分的轻巧

docker基于go语言开发!开源项目!

docker不是模拟一个完整的系统

docker安装与启动

# 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine


# 安装依赖和docker插件
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 返回的列表取决于启用了哪些存储库,并且特定于您的 CentOS 版本(.el7在本例中由后缀表示)
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin


# 启动 Docker
sudo systemctl start docker


# hello-world 通过运行映像来验证 Docker 引擎是否已正确安装。
sudo docker run hello-world

docker常用操作

[root@instance-6fuvnygy ~]# docker --help
Commands:
attach	 	Attach to a running Container 		# 当前 shell下 attach 连接指定运行镜像
`build`	 	Build an image from a Dockerfile 	# 通过 Dockerfile 定制镜像
commit	 	Create a new image from a container changes 	# 提交当前容器为新的镜像
cp 		 	Copy files/folders from containers filesystem to the host path # 从容器中拷贝指定文件或目录到宿主机中
create	 	Create a new container				# 创建一个新的容器,同run,但不启动容器
diff	 	Inspect changes on a container's filesystem 	# 查看 docker 容器变化
events	 	Get real time events form the server 	# 从 docker 服务获取容器实时事件
`exec` 	 	Run a command in an existing container	# 在已存在的容器上运行命令
export	 	Stream the containers of container as a tar archive# 导出容器的内容流作为一个tar 归档文件【对应import】
`history`  	show the history of an image		# 展示一个镜像形成历史
`images` 	 	list images							# 列出系统当前镜像
import	 	create a new filesystem image from the contents # 从tar 包中的内容创建一个新的文件系统映像【对应export】
info	 	display system-wide infomation		# 显示系统相关信息
`inspect`	 	return low-level infomation on a container	# 查看容器详细信息 ***
kill	 	kill a running container			# kill 指定 docker 容器
`load`	 	load an image from a tar archive	# 从一个 tar 包中加载一个镜像【对应 save】
login	 	register or login to the docker registry server		# 注册或者登陆一个 docker 源服务器
logout	 	log out from a docker registry server	# 从当前 docker registry退出
`logs` 	 	fetch the logs of a container		# 输出当前容器日志信息
port 	 	lookup the public-facing port which is NAT-ed to PRIVATE_PORT 	# 查看映射端口对应的容器内部源端口
pause	 	pause all processes within a container		# 暂停容器
`ps`		 	list containers						# 列出容器列表
pull 	 	pull an image or a repository from the docker # 从docker镜像源服务器拉取指定镜像或者库镜像 ***
`push`	 	push an image or a repository to the docker registry server	# 推送指定镜像或者库镜像至docker源服务器
restart	 	restart a running container			# 重启运行的服务器
`rm` 		 	remove one or more containers		# 移除一个或者多个容器
`rmi` 	 	remove more images# 移除多个镜像(无容器使用该镜像才可以删除,否则需删除相关容器才可继续或 -f 强制删除)
`run` 	 	run a command in a new container	# 创建一个新的容器并运行一个命令
`save`	 	save an image to a tar archive 		# 保存一个镜像为一个tar包【对应 load】
search 	 	search for an image on the docker hub 		# 在 docker hub 中搜索镜像
start	 	start a stopped container			# 启动容器
stop	 	stop a running container			# 启动容器
`tag` 	 	tag an image into a repository		# 给源镜像搭标签
`top`		 	lookup the running processes of a container		# 查看容器中运行的进程信息
unpause	 	unpause a paused container			# 取消暂停容器
version	 	show the docker version infomation		# 查看 docker 版本号
wait 	 	block until a container stops,then print its exit code 		# 截取容器停止时间的退出状态值

Container

docker run 运行一个容器

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]


# 常用参数
--name="name"		容器名字   nginx01   nginx02  用来区分容器
-d 					后台方式运行
-it					使用交互方式运行,进入容器查看内容
-p					指定容器的端口,	-P 8080:8080		
-P					随机指定端口

  • 容器相关操作命令
# 创建容器交互式
docker run -it --name:c1 -v /root/data:/root/data redis:5.0 /bin/bash
# 后台创建
docker run -id --name:c1 -v /root/data:/root/data redis:5.0 /bin/bash
# 查看容器
docker ps -a
# 删除容器
docker rm c1
# 进入容器
docker exec -it name /bin/bash
# 启动容器停止
docker start c1
docker stop c1

docker ps 列出容器

[root@instance-6fuvnygy ~]# docker ps -a 

# -a 查看所有容器

# -q 显示容器id
CONTAINER ID IMAGE  COMMAND        CREATED        STATUS          PORTS                 NAMES              
79405a6a0a9e nginx "/docker-ent"   4 days ago     Up 4 days       0.0.0.0:8090->80/tcp  nginx
cd3a825fedeb nginx "/docker-ent"   30 seconds ago Exited (0) 2...                       mystifying_leakey

docker rm 删除容器

  • 批量操作方式

    • docker rm ...

      $ docker rm cd3 269 34b 751
      
    • docker rm $(docker ps -aq )

      $ docker rm $(docker  ps -aq)
      cd3a825fedeb
      269494fe89fa
      34b68af9deef
      7513949674fc
      

docker start|stop|restart 容器启动|停止|重启

docker start 容器id			# 启动容器
docker restart 容器id		    # 重启容器
docker stop 容器id			# 停止当前正在运行的容器
docker kill 容器id			# 强制停止当前的容器

docker attach | exec 进入容器

  • attatch 进入容器正在执行的终端,不会启动新的进程

    [root@instance-6fuvnygy ~]# docker attach --help
    
    Usage:  docker attach [OPTIONS] CONTAINER
    
    
  • docker exec -it 进入容器后开启一个新的终端,可以进行操作(常用)

[root@instance-6fuvnygy ~]# docker exec -it aea360f5104a bash

退出容器 exit | ctrl+P+Q

# exit 推出容器,容器直接结束


# ctrl+P+Q 推出容器,容器继续执行 类似于 sreen ctrl+a+d

docker top 查看容器中进程信息

[root@instance-6fuvnygy ~]# docker top 8e5
UID        PID    PPID      C    STIME      TTY      TIME                CMD
polkitd    33752  33731     0    16:38      ?        00:00:46            redis-server 0.0.0.0:6379 [cluster]
root       41947  33731     0    18:41      ?        00:00:00            /bin/bash
root       42069  33731     0    18:43      ?        00:00:00            /bin/bash

docker log 查看容器日志

# 常用命令
[root@instance-6fuvnygy ~]# docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

[root@instance-6fuvnygy ~]# docker logs -tf --tail=10  8e5
2022-06-18T08:57:08.084547332Z 23:C 18 Jun 2022 08:57:08.084 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
2022-06-18T08:57:08.084555353Z 1:M 18 Jun 2022 08:57:08.084 # Diskless rdb transfer, done reading from pipe, 1 replicas still up.
2022-06-18T08:57:08.087452719Z 1:M 18 Jun 2022 08:57:08.087 * Background RDB transfer terminated with success
2022-06-18T08:57:08.087464993Z 1:M 18 Jun 2022 08:57:08.087 * Streamed RDB transfer with replica 172.38.0.12:6379 succeeded (socket). Waiting for REPLCONF ACK from slave to enable streaming
2022-06-18T08:57:08.087469902Z 1:M 18 Jun 2022 08:57:08.087 * Synchronization with replica 172.38.0.12:6379 succeeded

docker cp 从容器中复制文件到宿主机

[root@instance-6fuvnygy ~]# docker cp --help

Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
	    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH

docker commit 将容器重新提交成一个镜像

[root@instance-6fuvnygy ~]# docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)
img

Volume

卷技术:目录的挂载,将我们容器内的目录,挂载到Linux上面!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

容器的持久化和同步操作!容器间也是可以数据共享的!

容器停止后,挂载的文件在修改后依然会同步

好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

1. 直接使用命令挂载 -v

docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口

# 以交互模式创建centos容器 , 将容器内/yisa_oe目录挂载到宿主机/yisa_Oe/docker_test目录
[root@instance-6fuvnygy yisa_oe]# docker run -it --name centos -v /yisa_oe/docker_test/:/yisa_oe/ centos  /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest


# 进入容器
[root@60fef606d081 /]# cd /yisa_oe/


# 创建readme.txt 并写入hello docker
[root@60fef606d081 yisa_oe]# touch readme.txt


# 退出dokcer 查看宿主机对应挂载目录  
[root@instance-6fuvnygy yisa_oe]# cd docker_test/
[root@instance-6fuvnygy docker_test]# ls
readme.txt
[root@instance-6fuvnygy docker_test]# cat readme.txt 
hello docker!!!!


# 查看容器挂载情况
[root@instance-6fuvnygy docker_test]# docker inspect 60fe
"Mounts": [
            {
                "Type": "bind",
                "Source": "/yisa_oe/docker_test",
                "Destination": "/yisa_oe",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],




# 容器停止后,修改的文件依然会同步
1、停止容器
[root@instance-6fuvnygy docker_test]# docker ps
CONTAINER ID IMAGE  COMMAND       CREATED       STATUS       PORTS           NAMES
60fef606d081 centos "/bin/bash"   8 minutes ago Up 8 minutes                 centos
9c011cf7270e 791d   "/bin/sh ..." 12 hours ago  Up 12 hours  9523/tcp        dreamy_yonath
79405a6a0a9e nginx  "/docker-…"   4 days ago    Up 4 days    :8090->80/tcp   nginx

[root@instance-6fuvnygy docker_test]# docker stop 60fe
60fe

2、宿主机修改文件
[root@instance-6fuvnygy docker_test]# vim readme.txt 

3、启动容器
[root@instance-6fuvnygy docker_test]# docker start 60fe
60fe

4.进入容器并查看容器内对应的文件内容
[root@instance-6fuvnygy docker_test]# docker exec -it 60fe /bin/bash
[root@60fef606d081 /]# cd /yisa_oe/ && ls
readme.txt

[root@60fef606d081 yisa_oe]# cat readme.txt 
hello docker!!!!

hello linux!!!!


5、容器内的数据同步成功

卷挂载三种方式:

-v 容器内路径      # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载  docker volume ls 是查看不到的
# 举例
1. 匿名挂载
[root@instance-6fuvnygy docker_test]# docker run -d  --name nginx_nm -v /etc/nginx nginx
2a5d10488fddfac92496fd585d1c21a2fe1267695f7c59162827b8aca292b23f

2. 具名挂载
[root@instance-6fuvnygy docker_test]# docker run -d  --name nginx_jm -v nginx:/etc/nginx nginx
1784258d9e50e49de38b7a685a39927e8fb87e6cffa333fdb886658cccb65cc6

3.指定路径挂载
*** 需要先在docker_test中生成一份nginx配置文件 , 否则nginx启动会失败
[root@instance yisa_oe]# docker run -it --name nginx_test02 -v/yisa_oe/docker_test/nginx:/etc/nginx nginx

4.查看启动的容器
[root@instance-6fuvnygy docker_test]# docker ps
CONTAINER ID   IMAGE     COMMAND        CREATED          STATUS        PORTS                NAMES
81ae53635aaa   nginx     "/docker-en"   2 minutes ago    Up 2 minutes   80/tcp              nginx_test02
1784258d9e50   nginx     "/docker-en"   51 minutes ago   Up 51 minutes  80/tcp              nginx_jm
2a5d10488fdd   nginx     "/docker-en"   52 minutes ago   Up 51 minutes  80/tcp              nginx_nm

5.查看卷挂载
[root@instance-6fuvnygy docker_test]# docker volume ls
DRIVER    VOLUME NAME
local     2cd615685bb20784d0343b17262d6db261f914baf7b1f239b2e7f534476ea91e
local     3b963b4cba2230bf09036c24c16da265df60013eeef6f92ffbee0bd06fba9d1c
local     0480ba76fe7431810fa84b107a5627992e517018553de62049be72797bafd82e
local     d4bb18884e7be0df22f3a7c6c83de932c008789b5902659c4e44001fafc43e11
local     nginx

6. 查看卷详细情况
[root@instance-6fuvnygy docker_test]# docker volume inspect nginx
[
    {
        "CreatedAt": "2022-06-18T11:39:44+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx/_data",
        "Name": "nginx",
        "Options": null,
        "Scope": "local"
    }
]
[root@instance-6fuvnygy docker_test]# docker inspect 1784
"Mounts": [
            {
                "Type": "volume",
                "Name": "nginx",
                "Source": "/var/lib/docker/volumes/nginx/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

总结:docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/自定义的卷名/_data下,如果指定了目录,docker volume ls 是查看不到的。

ro #readonly 只读
rw #readwrite 可读可写

$ docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx

$ docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx


# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

2.容器间数据同步 --volumes-from

# 构建dockerfile
1 FROM centos
2 
3 VOLUME ["/yisa_oe"]
4 
5 WORKDIR /yisa_oe
6 
7 CMD echo "--------------------get started------------------------"
8 
9 CMD /bin/bash


# 生成镜像
[root@instance-6fuvnygy docker]# docker build -f Docekerfile_test -t demo:1.0 .


# 运行容器

# 生成第一个容器 挂载卷到宿主机 /yisa_oe/docker_test/demo_test
[root@instance demo_test]# docker run -it --name demo1 -v /yisa_oe/docker_test/demo_test:/yisa_oe demo:1.0 


# 生成第二个容器 , 卷同步至第一个容器
[root@instance-6fuvnygy demo_test]# docker run -it  --name demo3  --volumes-from demo2   demo:1.0 


# 进入demo3容器下的index.html 写入内容 , 内容同步至demo2 和 宿主机挂载的目录
[root@instance-6fuvnygy demo_test]# cat index.html 
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>


# 停止demo2 宿主机文件写入内容 查看demo3中对应文件
[root@instance-6fuvnygy demo_test]# docker exec -it demo3 /bin/bash
[root@3679baf66d57 yisa_oe]# 
[root@3679baf66d57 yisa_oe]# 
[root@3679baf66d57 yisa_oe]# cat index.html 
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>
<h1>hello world!</h1>
<h6>hello world!</h6>
<h6>hello world!</h6>
<h6>hello world!</h6>
<h6>hello world!</h6>
<h6>hello world!</h6>
<h6>hello world!</h6>
<h6>hello world!</h6>

结论:

容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

拓展:

多个mysql实现数据共享


# 第一个mysql容器和宿主机目录实现挂载

# 其余开启的mysql容器和第一个容器完成挂载


$ docker run -d -p 3306: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


$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7


Image

镜像常用命令

[root@instance-6fuvnygy ~]# docker image help

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

docker images 显示镜像

[root@instance-6fuvnygy ~]# docker images -a

# -a 显示所有 

# -q 显示imageid
REPOSITORY                 TAG       IMAGE ID       CREATED        SIZE
redis                      latest    53aa81e8adfa   3 weeks ago    117MB
nginx                      latest    0e901e68141f   3 weeks ago    142MB
hello-world                latest    feb5d9fea6a5   8 months ago   13.3kB

docker search 去dockerhub上面搜索镜像

[root@instance-6fuvnygy ~]# docker search nginx
NAME                 DESCRIPTION                STARS    OFFICIAL   AUTOMATED
nginx                Official build of Nginx.   16963    [OK]       
linuxserver/nginx    An Nginx container,bro …   169          
bitnami/nginx        Bitnami nginx Docker Image 131                 [OK]
ubuntu/nginx         Nginx, a high-performance… 52                   

docker pull 去dockerhub上面拉取镜像

[root@instance-6fuvnygy ~]# docker pull php
Using default tag: latest
latest: Pulling from library/php
Digest: sha256:85b8803c19474a807ac3c814f1894b37ee34cd4d6a6e34d728bbc6f8292b44d4
Status: Downloaded newer image for php:latest
docker.io/library/php:latest

docker rmi 删除本地镜像

[root@instance-6fuvnygy ~]# docker rmi feb
Untagged: hello-world:latest
Untagged: hello-world@sha256:80f31da1ac7b312ba29d65080fddf797dd76acfb870e677f390d5acba9741b17
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

docker tag 镜像重新打标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]   # SOURCE_IMAGE 原始镜像  TARGET_IMAGE 目标镜像

镜像的获取三种方式

  1. pull from registry (online) 从registry拉取
# 默认从Docker Hub拉取,如果不指定版本,会拉取最新版

# 不指定版本

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest


# 指定版本

$ docker pull nginx:1.20.0
1.20.0: Pulling from library/nginx
Status: Downloaded newer image for nginx:1.20.0
docker.io/library/nginx:1.20.0
  1. build from Dockerfile (online) 从Dockerfile构建(常用)
docker build -f dockerfole -t demo:tag . # 从当前目录通过dockerfiel文件生成tag版本demo镜像
  1. load from file (offline) 文件导入 (离线)
[root@yangy docker_file]# docker image ls
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
demo                       1.0       e5d627e73e64   6 months ago    231MB
nginx                      latest    0e901e68141f   7 months ago    142MB
centos                     centos7   eeb6ee3f44bd   16 months ago   204MB
centos                     latest    5d0da3dc9764   16 months ago   231MB

# 将镜像保存成tar文件
[root@yangy docker_file]# docker  save -o  nginx_latest.tar 0e901e68141f

[root@yangy docker_file]# ls
nginx_latest.tar

# 从本地文件导入镜像
[root@yangy docker_file]# docker load -i nginx_latest.tar
Loaded image ID: sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d

Dockerfile

狂神说Docker进阶笔记_linux_21

构建步骤:

  1. 编写一个dockerfile文件

  2. docker build 构建称为一个镜像

  3. docker run运行镜像

  4. docker push发布镜像DockerHub

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序

3、#表示注释

4、每一个指令都会创建提交一个新的镜像曾,并提交!

DockerFile的指令:

FROM               # from:基础镜像,一切从这里开始构建
MAINTAINER         # maintainer:镜像是谁写的, 姓名+邮箱
RUN                # run:镜像构建的时候需要运行的命令
ADD                # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR            # workdir:镜像的工作目录
VOLUME             # volume:挂载的目录
EXPOSE             # expose:保留端口配置
CMD                # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT         # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD            # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
COPY               # copy:类似ADD,将我们文件拷贝到镜像中
ENV                # env:构建的时候设置环境变量!

# CMD 和 ENTRYPOINT区别
CMD                # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT         # 指定这个容器启动的时候要运行的命令,可以追加命令
#查看DockerFile内容
1 FROM centos:centos7
2
3 ADD api-zd /yisa_oe/api-zd/api-zd
4 ADD config.yaml /yisa_oe/api-zd/config.yaml
5 
6 WORKDIR /yisa_oe/api-zd
7 RUN chmod -R 0777 api-zd
8 EXPOSE 9523
9 CMD  ./api-zd


# 构建镜像
[root@instance-6fuvnygy docker]# docker build -t go_demo:1.1 .

# -f  如果文件名为Dockerfile 可不加

# -t  image生成的版本
Sending build context to Docker daemon  24.86MB
Step 1/7 : FROM centos:centos7

 ---> eeb6ee3f44bd
Step 2/7 : ADD api-zd /yisa_oe/api-zd/api-zd

 ---> Using cache

 ---> f7f52f52f185
Step 3/7 : ADD config.yaml /yisa_oe/api-zd/config.yaml

 ---> Using cache

 ---> df2b916842dc
Step 4/7 : WORKDIR /yisa_oe/api-zd

 ---> Using cache

 ---> 395106517174
Step 5/7 : RUN chmod -R 0777 api-zd

 ---> Using cache

 ---> 9290d9b0d653
Step 6/7 : EXPOSE 9523

 ---> Using cache

 ---> 46d8978d9129
Step 7/7 : CMD  ./api-zd

 ---> Using cache

 ---> 791d97bc214f
Successfully built 791d97bc214f
Successfully tagged go_demo:1.1


# 查看生成的镜像
[root@instance-6fuvnygy docker]# docker image ls
REPOSITORY                 TAG       IMAGE ID       CREATED        SIZE
go_demo                    1.1       791d97bc214f   12 days ago    230MB

docker history 查看镜像构建历史步骤

[root@instance-6fuvnygy demo_test]# docker history 791d
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
791d97bc214f   12 days ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "./ap…   0B        
46d8978d9129   12 days ago    /bin/sh -c #(nop)  EXPOSE 9523                  0B        
9290d9b0d653   12 days ago    /bin/sh -c chmod -R 0777 api-zd                 12.8MB    
395106517174   12 days ago    /bin/sh -c #(nop) WORKDIR /yisa_oe/api-zd       0B        
df2b916842dc   12 days ago    /bin/sh -c #(nop) ADD file:12df5f52543fefe5d…   465B      
f7f52f52f185   12 days ago    /bin/sh -c #(nop) ADD file:e28ac3340607e0c45…   12.8MB    
eeb6ee3f44bd   9 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      9 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      9 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB 

推送镜像到dockerhub

# 登录
[root@instance-6fuvnygy demo_test]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username



# 推送镜像至dockerhub
[root@instance-6fuvnygy demo_test]# docker push XXX/XXX
The push refers to repository [docker.io/XXX/XXX]
13ba2d8fa2c7: Pushed 
310e4cc23683: Pushed 
63d02f9bd28b: Pushed 
174f56854903: Mounted from library/centos 
1.0: digest: sha256:ac5abf87f3cf9290aa24f6ad8b566d329be7dd904e5e4e7c252826f29ce9f046 size: 1158

Network

三个网络

[root@instance-6fuvnygy demo_test]# ip addr

# 本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

# 云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether fa:28:00:10:ae:1f brd ff:ff:ff:ff:ff:ff
    inet 172.16.16.4/20 brd 172.16.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f828:ff:fe10:ae1f/64 scope link 
       valid_lft forever preferred_lft forever

# docker0地址       
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:5b:2c:de:58 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:5bff:fe2c:de58/64 scope link 
       valid_lft forever preferred_lft forever

问题: docker 是如果处理容器网络访问的?

原理:1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术 ; 2 、再启动一个容器测试,发现又多了一对网络

我们发现这个容器带来网卡,都是一对对的
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

结论:容器和容器之间是可以互相ping通

网络模型图

狂神说Docker进阶笔记_docker_34

小结

Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0

Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

只要容器删除,对应的网桥一对就没了

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip

docker0问题:不支持容器名连接访问!

自定义网络

[root@instance-6fuvnygy ~]# docker network

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

网络模式

[root@instance-6fuvnygy ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3efc54cdf895   bridge    bridge    local  # 桥接 docker(默认,自己创建也是用bridge模式)
166927324fa7   host      host      local  # 和所主机共享网络
31eb0c88879d   none      null      local  # 不配置网络,一般不用
116c56f2b39e   redis     bridge    local

我们直接启动的命令 --net bridge,而这个就是我们得docker0 , bridge就是docker0

$ docker run -d -P --name nginx tomcat  <=>  docker run -d -P --name nginx --net bridge tomcat

创建网络

$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

查看网络

[root@instance-6fuvnygy ~]# docker network inspect 116
[
    {
        "Name": "redis",
        "Id": "116c56f2b39e5f245df872a9f0b68ee7cd66f3dbd1c4b51ed65a08f1c442df63",
        "Created": "2022-06-18T16:25:48.469105478+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.38.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "f06f2f1d44072efc176f700e84520c1a042de4312600dc3bae3aad23d6a48273": {
                "Name": "redis-5",
                "EndpointID": "e757824a2e7ad3ac10676bcc0dd00430bef723e9fe4b954586e6f11ff4d2c792",
                "MacAddress": "02:42:ac:26:00:0f",
                "IPv4Address": "172.38.0.15/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

容器连接到网络

[root@instance-6fuvnygy ~]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER


# 假设要跨网络操作别人,就需要使用docker network connect 连通!

实战

1. 部署Redis集群

  1. 创建网卡
docker network create redis --subnet 172.38.0.0/16  # 创建一个redis网卡 172.38.0.0 - 172.38.255.255

[root@instance-6fuvnygy docker]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3efc54cdf895   bridge    bridge    local
166927324fa7   host      host      local
31eb0c88879d   none      null      local
116c56f2b39e   redis     bridge    local

  1. 创建redis配置相关目录
# 通过脚本创建六个redis配置 准备工作
for port in $(seq 1 6); \
do \
mkdir -p $PWD/node-${port}/conf
touch  $PWD/node-${port}/conf/redis.conf
cat << EOF > $PWD/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done



# redis配置相关介绍
cluster-enabled yes # 开启集群模式
cluster-config-file nodes.conf  # 设定节点配置文件名
cluster-node-timeout 5000 # 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-announce-ip 172.38.0.1${port} # 实际为各节点网卡分配ip 先用一个ip代替
cluster-announce-port 6379 ##节点映射端口
cluster-announce-bus-port 16379 # 集群总线端口
appendonly yes #持久化模式
  1. 运行redis容器
for port in $(seq 1 6);\
docker run -p 600${port}:6379 -p 1667${port}:16379 --name redis-1 \
-v $PWD/node-${port}/data:/data \
-v $PWD/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis redis-server /etc/redis/redis.conf


# redis-1
docker run -p 6001:6379 -p 16671:16379 --name redis-1 -v $PWD/node-1/data:/data -v $PWD/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.11 redis redis-server /etc/redis/redis.conf

# redis-2
docker run -p 6002:6379 -p 16672:16379 --name redis-2 -v $PWD/node-2/data:/data -v $PWD/node-2/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.12 redis redis-server /etc/redis/redis.conf

# redis-3
docker run -p 6003:6379 -p 16673:16379 --name redis-3 -v $PWD/node-3/data:/data -v $PWD/node-3/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.13 redis redis-server /etc/redis/redis.conf

# redis-4
docker run -p 6004:6379 -p 16674:16379 --name redis-4 -v $PWD/node-4/data:/data -v $PWD/node-4/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.14 redis redis-server /etc/redis/redis.conf

# redis-5
docker run -p 6005:6379 -p 16675:16379 --name redis-5 -v $PWD/node-5/data:/data -v $PWD/node-5/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.15 redis redis-server /etc/redis/redis.conf

# redis-6
docker run -p 6006:6379 -p 16676:16379 --name redis-6 -v $PWD/node-6/data:/data -v $PWD/node-6/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.16 redis redis-server /etc/redis/redis.conf
  1. 进入容器,完成redis集群配置
# 进入redis容器
[root@instance-6fuvnygy docker]# docker exec -it 90d /bin/bash
root@90d9f3423b94:/data# 


# redis-cli 连接redis 并配置集群

#  --cluster-replicas 1 数字表示主节点对应的从节点 
root@90d9f3423b94:/etc/redis# redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379  --cluster-replicas 1

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 3c7978360203b50d7e6269d619d3929838b6c43c 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 306fd6cbe116159e02e1b73c85cabfba3fce3026 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 026a47644b7997b560426fca6de46bff68159c0d 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 60290da62f04de060f1c3ae88f63f2da060a2786 172.38.0.14:6379
   replicates 026a47644b7997b560426fca6de46bff68159c0d
S: b4189d59bd303b9b58ec6e8e9c5ae235edab6cdd 172.38.0.15:6379
   replicates 3c7978360203b50d7e6269d619d3929838b6c43c
S: 5aae196eb52afd886f2dbec24154a1adfae865a2 172.38.0.16:6379
   replicates 306fd6cbe116159e02e1b73c85cabfba3fce3026
Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.

>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 3c7978360203b50d7e6269d619d3929838b6c43c 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b4189d59bd303b9b58ec6e8e9c5ae235edab6cdd 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 3c7978360203b50d7e6269d619d3929838b6c43c
S: 60290da62f04de060f1c3ae88f63f2da060a2786 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 026a47644b7997b560426fca6de46bff68159c0d
S: 5aae196eb52afd886f2dbec24154a1adfae865a2 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 306fd6cbe116159e02e1b73c85cabfba3fce3026
M: 026a47644b7997b560426fca6de46bff68159c0d 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 306fd6cbe116159e02e1b73c85cabfba3fce3026 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...
[OK] All 16384 slots covered.


# 进入redis
root@90d9f3423b94:/etc/redis# redis-cli -c


# 查看集群转态
127.0.0.1:6379> cluster nodes
b4189d59bd3 172.38.0.15:6379@16379 slave 3c7978360203b50d7e6269d619d 0 1655541767503 1 connected
60290da62f0 172.38.0.14:6379@16379 slave 026a47644b7997b560426fca6de 0 1655541767302 3 connected
5aae196eb52 172.38.0.16:6379@16379 slave 306fd6cbe116159e02e1b73c85c 0 1655541768507 2 connected
3c797836020 172.38.0.11:6379@16379 myself,master - 0 1655541767000 1 connected 0-5460
026a47644b7 172.38.0.13:6379@16379 master - 0 1655541768306 3 connected 10923-16383
306fd6cbe11 172.38.0.12:6379@16379 master - 0 1655541768000 2 connected 5461-10922


# 设置key
127.0.0.1:6379> set name redis

-> Redirected to slot [5798] located at 172.38.0.12:6379
OK


# 查看key
172.38.0.12:6379> get name 
"redis"


# 停止redis-2容器
[root@instance-6fuvnygy yisa_oe]# docker stop e73
e73


# 查看集群状态
127.0.0.1:6379> cluster nodes
b4189d59bd303b9b 172.38.0.15:6379@16379 slave 3c7978360203b50d7e626 0 1655542526544 1 connected
60290da62f04de06 172.38.0.14:6379@16379 slave 026a47644b7997b560426 0 1655542526000 3 connected
5aae196eb52afd88 172.38.0.16:6379@16379 master - 0 1655542526544 7 connected 5461-10922
3c7978360203b50d 172.38.0.11:6379@16379 myself,master - 0 1655542526000 1 connected 0-5460
026a47644b7997b5 172.38.0.13:6379@16379 master - 0 1655542526845 3 connected 10923-16383
306fd6cbe116159e 172.38.0.12:6379@16379 master,fail - 1655542290027 1655542288000 2 connected



# 查看key
127.0.0.1:6379> get name 

-> Redirected to slot [5798] located at 172.38.0.16:6379
"redis"


# 重启redis-2容器
[root@instance-6fuvnygy yisa_oe]# docker start e73
e73


# 查看集群状态
127.0.0.1:6379> cluster nodes
b4189d59bd303b9b5 172.38.0.15:6379@16379 slave 3c7978360203b50d7e6269d619 0 1655542625186 1 connected
60290da62f04de060 172.38.0.14:6379@16379 slave 026a47644b7997b560426fca6d 0 1655542625000 3 connected
5aae196eb52afd886 172.38.0.16:6379@16379 master - 0 1655542625086 7 connected 5461-10922
3c7978360203b50d7 172.38.0.11:6379@16379 myself,master - 0 1655542624000 1 connected 0-5460
026a47644b7997b56 172.38.0.13:6379@16379 master - 0 1655542624181 3 connected 10923-16383
306fd6cbe116159e0 172.38.0.12:6379@16379 slave 5aae196eb52afd886f2dbec241 0 1655542626189 7 connected