docker学习笔记

docker概述

docker为什么流行?它的优势是什么?能解决什么问题?

  • 解决部署的难题,尤其是集群环境的部署
  • 版本更新及不同环境下导致运行出问题

docker特点

  1. 容器与容器之间相互隔离
  2. 最大得发挥服务器的性能

docker在百度云服务器的安装

服务器版本要求

centos 3.10.0-957.27.2.el7.x86_64

第一步:卸载旧版本的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

第三步:配置阿里云镜像安装docker

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第四步:安装最新社区版docker

yum install docker-ce docker-ce-cli containerd.io

第五步:启动docker

systemctl start docker

第六步:确认docker是否安装成功,同时确认docker安装版本

docker version

第七步:运行hello-world

docker run hello-world

第八步:查看镜像docker images

[root@instance-xrx1ekbd docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB

第九步:删除docker

# 第一步
yum remove docker-ce docker-ce-cli containerd.io
# 第二步
rm -rf /var/lib/docker

配置阿里云镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://5wjhaci2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker 常用命令

帮助命令

docker version			# docker版本信息
docker info 				# docker 详细信息
docker 命令 --help	 # docker 帮助命令

镜像

docker images 查看所有本地主机上的镜像

[root@instance-xrx1ekbd ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        4 days ago          133MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB

# 可选
	-a, --all							# 列出所有的镜像
	-q, --quiet 					# 只显示镜像的id

docker search 搜索镜像

[root@instance-xrx1ekbd ~]# docker search nginx
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                              Official build of Nginx.                        13736               [OK]                
jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   1873                                    [OK]
richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   786                                     [OK]

# 可选项
	--filter=stars=1873

[root@instance-xrx1ekbd ~]# docker search nginx --filter=STARS=1873
NAME                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                 Official build of Nginx.                        13736               [OK]                
jwilder/nginx-proxy   Automated Nginx reverse proxy for docker con…   1873                                    [OK]

docker pull 下载镜像

# 下载镜像docker pull mysql:5.7 下载5.7固定版本
[root@instance-xrx1ekbd ~]# docker pull mysql
Using default tag: latest   					# 默认下载最新版本
latest: Pulling from library/mysql
d121f8d1c412: Already exists 
f3cebc0b4691: Pull complete 					# 文件分层下载,核心是 联合文件系统
1862755a0b37: Pull complete 
489b44f3dbb4: Pull complete 
690874f836db: Pull complete 
baa8be383ffb: Pull complete 
55356608b4ac: Pull complete 
dd35ceccb6eb: Pull complete 
429b35712b19: Pull complete 
162d8291095c: Pull complete 
5e500ef7181b: Pull complete 
af7528e958b6: Pull complete 
Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest 				# 真实地址

docker rmi -f 镜像id 删除镜像

[root@instance-xrx1ekbd ~]# docker rmi -f e1d7dc9731da
Untagged: mysql:latest
Untagged: mysql@sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
Deleted: sha256:e1d7dc9731daa2c79858307d65ef35f543daf97457b9c11b681f78bb86f7a158
Deleted: sha256:303dd82484b7080d07af8ab7f383755d8b4d723a2ade8c2e3a516ae59fbc1d63
Deleted: sha256:6346e1a264e283de286e399bc798b8e6a910176180aa1ef1acc54dbace18111a
Deleted: sha256:6c7a3d83131ddf3414e34e14826cbfb8f01a6d6486cd41d9a7a2bcc84350b4f0
Deleted: sha256:79b91792bcadd6668ab861a83623dedcc38574c5f033d2f8336671588a1c4de0
Deleted: sha256:00bdff03938c98e1fee710e8c447a1c30e7365859dd28e2a166792d7cd343fa9

# 删除所有的镜像
[root@instance-xrx1ekbd ~]# docker rmi -f $(docker images -aq)

容器

新建容器并启动

docker run  [可选参数] image

# 参数说明
	--name="name"		容器名字,用来区分不同的容器
	-d 							以后台进程启动
	-it 						使用交互式方式启动,直接进入容器内部
	-p							指定容器的端口
			-p	主机端口:容器端口 常用
			-p	容器端口
	-P							指定随机端口(大写)
	
[root@instance-xrx1ekbd ~]# docker run -it centos /bin/bash
#	进入到容器内部
[root@15fb42080876 /]# ll
bash: ll: command not found
[root@15fb42080876 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@15fb42080876 /]# exit		# 退出容器

查看运行的容器

docker ps
				# 正在运行的容器
	-a		# 查看运行过的容器
	-n=?	# 显示最近创建的容器
	-q 		# 只显示容器的编号
	
# 查看正在运行的容器
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
15fb42080876        centos              "/bin/bash"         About a minute ago   Up About a minute                       awesome_mclean

# 查看运行过的容器
[root@instance-xrx1ekbd ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
15fb42080876        centos              "/bin/bash"         2 minutes ago       Exited (0) 7 seconds ago                       awesome_mclean
78529ee8eb85        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                          crazy_easley

退出容器

exit					# 容器停止并退出
ctrl + p + q	# 容器不停止退出

停止运行容器

docker stop 容器id			# 停止容器
docker start 容器id			# 启动容器
docker restart 容器id		# 重启容器
docker kill 容器id			# 强制停止容器

删除容器

docker rm 容器id										 # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) 			# 可删除所有容器
docker rm -a -q|xargs docker rm			# 可删除所有容器

常用其他容器

后台启动容器

docker run -d centos
[root@instance-xrx1ekbd ~]# docker run -d centos
c8f9952ea9cbc77cd8d1d34ba3f2b4623e4564768a58aa7fecb59b923b55c1d2
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# 发现centos 并没有后台运行,即centos停止了
# 解释:centos 后台运行的条件是必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

[root@instance-xrx1ekbd ~]# docker logs -f -t --tail 10 容器id

#	显示日志
	-ft				# 显示日志
	--tail		# 显示指定条数的日志

查看容器中的进程信息

# docker top 容器id
[root@instance-xrx1ekbd ~]# docker top c4757790f1d2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                18367               18340               0                   23:18               pts/0               00:00:00            /bin/bash

查看镜像的元数据

# docker inspect 容器id
[root@instance-xrx1ekbd ~]# docker inspect c4757790f1d2
[
    {
        "Id": "c4757790f1d235e10600117e9789e33c999578b6562495333c38ae414187e9f0",
        "Created": "2020-09-16T15:18:43.781056665Z",
        "Path": "/bin/bash",
        "Args": [],

进入当前运行的容器

# 容器一般都是后台运行的,常用操作进入正在运行的容器的
# 命令	docker exec -it 容器id bash shell

[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c4757790f1d2        centos              "/bin/bash"         13 minutes ago      Up 13 minutes                           gracious_panini
[root@instance-xrx1ekbd ~]# docker exec -it c4757790f1d2 /bin/bash
[root@c4757790f1d2 /]# 

# 方式二	docker attach -it 容器id bash shell
# docker exec			# 进入开启新的终端
# docker attach		# 进入正在运行的终端

从容器内拷贝东西到宿主机

# 命令:docker cp

# test.java 拷贝不出来???
[root@instance-xrx1ekbd home]# docker exec -it 72b8a35ff5c1 /bin/bash
[root@72b8a35ff5c1 /]# cd home/
[root@72b8a35ff5c1 home]# ls
test.java
[root@72b8a35ff5c1 home]# exit
exit
[root@instance-xrx1ekbd home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
72b8a35ff5c1        centos              "/bin/bash"         6 minutes ago       Up About a minute                       practical_clarke
[root@instance-xrx1ekbd home]# docker cp 72b8a35ff5c1:/home/test.jave /home
Error: No such container:path: 72b8a35ff5c1:/home/test.jave

# 问题所在:文件名书写错误
[root@instance-xrx1ekbd home]# docker cp 72b8a35ff5c1:/home/test.java /home

实操

将tomcat 镜像启动后重新打包成新的镜像

打包成新的镜像

# 后台启动tomcat 并将端口映射到80
[root@instance-xrx1ekbd ~]# docker run -d -p 80:8080 tomcat:9.0 
9a23727963ffd3d579dd5c72689133f80b66e5b104a35e7909dd7eb598d9d267
[root@instance-xrx1ekbd ~]# dockerps
-bash: dockerps: 未找到命令
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
9a23727963ff        tomcat:9.0          "catalina.sh run"   7 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   goofy_leakey
# 进入到运行中的容器
[root@instance-xrx1ekbd ~]# docker exec -it 9a23727963ff /bin/bash
root@9a23727963ff:/usr/local/tomcat# ll
bash: ll: command not found
root@9a23727963ff:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
# 将webapps.dist拷贝到webapps
root@9a23727963ff:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@9a23727963ff:/usr/local/tomcat# cd webapps
root@9a23727963ff:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@9a23727963ff:/usr/local/tomcat/webapps# 

# 访问80端口确认tomcat 是否开启成功
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
9a23727963ff        tomcat:9.0          "catalina.sh run"   2 minutes ago       Up 2 minutes        0.0.0.0:80->8080/tcp   goofy_leakey
# 将运行的容器打包成新的镜像 
[root@instance-xrx1ekbd ~]# docker commit -a="pipi" -m="add webapps app" 9a23727963ff myTomcat:1.0
invalid reference format: repository name must be lowercase # 名称不能大写
[root@instance-xrx1ekbd ~]# docker commit -a="pipi" -m="add webapps app" 9a23727963ff mytomcat:1.0
sha256:dbe9d82ea3a9156ce5823bea0cfb543219296e4a955b2a53edb5b328d3e0fb8a
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            1.0                 dbe9d82ea3a9        13 seconds ago      652MB
tomcat              9.0                 f796d3d2c195        3 days ago          647MB
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
mysql               5.7                 ef08065b0a30        9 days ago          448MB
centos              latest              0d120b6ccaa8        5 weeks ago         215MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
[root@instance-xrx1ekbd ~]# 

启动新的镜像

[root@instance-xrx1ekbd ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            1.0                 dbe9d82ea3a9        13 seconds ago      652MB
tomcat              9.0                 f796d3d2c195        3 days ago          647MB
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
mysql               5.7                 ef08065b0a30        9 days ago          448MB
centos              latest              0d120b6ccaa8        5 weeks ago         215MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
9a23727963ff        tomcat:9.0          "catalina.sh run"   11 minutes ago      Up 11 minutes       0.0.0.0:80->8080/tcp   goofy_leakey
[root@instance-xrx1ekbd ~]# docker stop 
"docker stop" requires at least 1 argument.
See 'docker stop --help'.

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
9a23727963ff        tomcat:9.0          "catalina.sh run"   11 minutes ago      Up 11 minutes       0.0.0.0:80->8080/tcp   goofy_leakey
[root@instance-xrx1ekbd ~]# docker stop 9a23727963ff
9a23727963ff
[root@instance-xrx1ekbd ~]# ll
总用量 44
drwxr-xr-x 6 root root 4096 1月   2 2020 ѡ??????ϵͳ
drwxr-xr-x 7 root root 4096 6月   1 18:23 ant-design-pro
drwxr-xr-x 5 root root 4096 11月 25 2019 daily_fresh
drwxr-xr-x 2 root root 4096 9月  13 16:17 docker
drwxr-xr-x 3 root root 4096 3月  31 22:38 env
drwxr-xr-x 3 root root 4096 11月 21 2019 html
drwxr-xr-x 4 root root 4096 3月  31 19:42 lh-healthy
drwxr-xr-x 2 root root 4096 11月 25 2019 packages
drwxr-xr-x 3 root root 4096 11月 16 2019 python
-rw-r--r-- 1 root root 1478 11月 25 2019 requirements.txt
-rw-r--r-- 1 root root  735 12月  2 2019 uploadFiles.html
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat            1.0                 dbe9d82ea3a9        7 minutes ago       652MB
tomcat              9.0                 f796d3d2c195        3 days ago          647MB
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
mysql               5.7                 ef08065b0a30        9 days ago          448MB
centos              latest              0d120b6ccaa8        5 weeks ago         215MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
[root@instance-xrx1ekbd ~]# docker run -d -p 3344:8080 mytomcat:1.0 
b4c3ed0df1fa0fc1c222d645428d6eeefe727cfb58b39ed86a7e3198554ca7eb

image-20200919230152742

容器数据卷

目的:为了容器的持久化和同步操作

使用数据卷

直接使用 -v 来挂载

# 启动容器并挂载数据到服务器/home/test目录下
[root@instance-xrx1ekbd ~]# docker run -it -v /home/test:/home centos 
[root@9cf5683a9dac /]# cd /home/
[root@9cf5683a9dac home]# ll
bash: ll: command not found
[root@9cf5683a9dac home]# ls
[root@9cf5683a9dac home]# touch test.txt
[root@9cf5683a9dac home]# ll
bash: ll: command not found
[root@9cf5683a9dac home]# ls
test.txt

# 切换到服务器/home/test 目录下
[root@instance-xrx1ekbd ~]# cd /home/
[root@instance-xrx1ekbd home]# ll
总用量 4
drwxr-xr-x 2 root root 4096 9月  19 23:20 test
[root@instance-xrx1ekbd home]# cd test
[root@instance-xrx1ekbd test]# ll
总用量 0
[root@instance-xrx1ekbd test]# ls
test.txt

查看元数据挂载情况

[root@instance-xrx1ekbd test]# docker inspect 9cf5683a9dac
[
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
]

实战mysql

mysql数据持久化的问题

# 获取镜像
[root@instance-xrx1ekbd test]# docker pull mysql:5.7

# 运行容器,需要做数据挂载 	安装mysql需要配置密码
# 官方命令 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动命令
	-d 			后台运行
	-p 			端口映射
	-v 			卷挂载
	-e 			环境配置
	--name 	指定别名
	
[root@instance-xrx1ekbd test]# docker run --name mysqlme -p 3305:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 
70a79cd380c65e8811d89926940649f87294c637f0bfe4bb30ddb8aa5352a983

image-20200919235255187

# 启动mysql后通过navicat连接成功后进入到容器挂载的服务器目录查看,并测试在navicat创建数据库,看挂载目录是否同步数据,事实显示数据同步没问题
[root@instance-xrx1ekbd data]# pwd
/home/mysql/data
[root@instance-xrx1ekbd data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem
[root@instance-xrx1ekbd data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test

docker 运行 mysql 报错

[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 

// 报错
docker: Error response from daemon: Conflict. The container name "/mysql" is already in use by container "99d2176d0421f8fd326430dccec9b5ac77dcdca32d934c7b39fc6a0dc75dd541". You have to remove (or rename) that container to be able to reuse that name.
  
// 原因:之前运行docker容器还没有退出,导致出现容器重名情况
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
99d2176d0421        mysql:5.7           "docker-entrypoint.s…"   13 minutes ago      Created                                          mysql
4d7410d9e39e        mysql:5.7           "docker-entrypoint.s…"   19 minutes ago      Created                                          mysqlme
004edb8a18e1        redis               "docker-entrypoint.s…"   47 hours ago        Up 47 hours             0.0.0.0:6379->6379/tcp   redis
b8129b2dd58f        hello-world         "/hello"                 2 days ago          Exited (0) 2 days ago                            affectionate_panini

// 解决办法:删除重名的容器
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker rm 99d2176d0421
99d2176d0421
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker rm 4d7410d9e39e  
4d7410d9e39e
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# 

docker 运行 mysql报错iptables failed

[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 
ffe1cdb677fd2531155501424ad322a57d293dc339b047013785249ff4527228
docker: Error response from daemon: driver failed programming external connectivity on endpoint mysql (fd147056d9b71efae8364dea1c01e5a3432353c09933ad40fc85c6f44e04f7f9):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.3:3306 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

// 解决方法:重启docker
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# systemctl restart docker

// 重新运行:运行正常
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 
2de61f0652ec3edd789927c8721e79b10b6c5e3eca7137b4cebc33857230b816

实战安装redis

获取redis镜像

docker pull redis

查看本地镜像

docker images

先在服务器创建挂载的目录和配置文件

mkdir -p /mydata/redis/conf
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# cd /mydata/redis/conf/
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# touch redis.conf

启动redis

docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

# 结果
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
004edb8a18e1f3f53702ef423834129cb060450046fc8452a833da244fa0a42b
  • 命令解释
    • -p 6379:6379 端口映射:前表示主机部分,:后表示容器部分。
    • --name myredis 指定该容器名称,查看和进行操作都比较方便。
    • -v 挂载目录,规则与端口映射相同。
    • -d redis 表示后台启动redis
    • redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis.conf
    • appendonly yes 开启redis 持久化

进入redis

[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker exec -it redis redis-cli
127.0.0.1:6379> 

具名和匿名挂载

# 匿名挂载
	-v 容器内路径							# 匿名挂载
	-v 服务器路径:容器内路径		# 具名挂载
	-v /服务器路径:容器内路径		# 指定路径挂载
	-v 容器内路径 ro rw				# ro 只读 rw 可读可写,默认
# 匿名挂载nginx
[root@instance-xrx1ekbd data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
01212adfe8817807ded3d27ac7a43bada131b5ed48d24bcf7f7fc1c4051921ee
[root@instance-xrx1ekbd data]# docker volumns ls
docker: 'volumns' is not a docker command.
See 'docker --help'
[root@instance-xrx1ekbd data]# docker volume ls
DRIVER              VOLUME NAME
local               6ce13f8fe124b56f09182832bfa9c0761116b9a5f9b051345f380dc583cc32ec
local               b20f1495bd4e5603bf2599d9519daf34fac649b9f6e265d7d5bf66a3f75147f1
# 具名挂载nginx 一般使用具名挂载
[root@instance-xrx1ekbd data]#  docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
eba1c55d3c47863e303e15977b05bf015ef752ec921461f4b5168de19519143b
[root@instance-xrx1ekbd data]# docker volume ls
DRIVER              VOLUME NAME
local               6ce13f8fe124b56f09182832bfa9c0761116b9a5f9b051345f380dc583cc32ec
local               b20f1495bd4e5603bf2599d9519daf34fac649b9f6e265d7d5bf66a3f75147f1
local               juming-nginx
# 查看挂载的目录地址
[root@instance-xrx1ekbd data]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-09-20T00:10:06+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 存储的目录
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
[root@instance-xrx1ekbd data]# cd /var/lib/docker/volumes/juming-nginx/_data
[root@instance-xrx1ekbd _data]# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

Dockerfile

DockerFile的指令

FROM 					# 基础镜像
MAINTAINER 		# 镜像是谁写的,姓名+邮箱
RUN 					# 镜像构建的时候需要运行的命令
ADD						# 步骤,tomcat镜像,这个【tomcat】压缩包要添加的内容
WORKDIR				# 镜像的工作目录
VOLUME				# 挂载的目录
EXPOST				# 保留端口配置
CMD						# 指定这个容器启动的时候要运行的命令。只有最后一个会生效,可被替代
ENTRPPOINT		# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD				# 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY					# 类似ADD,将我们文件拷贝到镜像中
ENV						# 构建的时候设置环境变量

Docker 网络

Docker0

清空所有环境

image-20200920094641941

redis集群

# 创建自己的网卡实战
[root@instance-xrx1ekbd ~]# docker network create redis --subnet 172.38.0.0/16
a6ccd838229d98a340889407eca8690ae7cc01cec5cf6c4b909236819db469dd
[root@instance-xrx1ekbd ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ae398ace097e        bridge              bridge              local
6874e8639270        host                host                local
56ecf8446811        none                null                local
a6ccd838229d        redis               bridge              local
[root@instance-xrx1ekbd ~]# docker network inspect redis
[
    {
        "Name": "redis",
        "Id": "a6ccd838229d98a340889407eca8690ae7cc01cec5cf6c4b909236819db469dd",
        "Created": "2020-09-20T10:41:58.210398693+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": {},
        "Options": {},
        "Labels": {}
    }
]

# redis集群搭建的脚本及相关命令
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/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 
# 节点1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
 -v /mydata/redis/node-1/data:/data \
 -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#	节点2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
 -v /mydata/redis/node-2/data:/data \
 -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#	节点3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
 -v /mydata/redis/node-3/data:/data \
 -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#	节点4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
 -v /mydata/redis/node-4data:/data \
 -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#	节点5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
 -v /mydata/redis/node-5/data:/data \
 -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
 -v /mydata/redis/node-6/data:/data \
 -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
 -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 
# 以交互模式进入redis
docker exec -it redis-1 /bin/sh
# 创建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
# 成功界面
/data # 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: 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379
   replicates 7e00472bdc843f274d065f252126f889bb025e64
S: 9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379
   replicates 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2
S: 7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379
   replicates 0348f1bc9463455ba3cf6c796297eaf301c2c5ef
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: 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 0348f1bc9463455ba3cf6c796297eaf301c2c5ef
M: 7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 7e00472bdc843f274d065f252126f889bb025e64
S: 9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2
M: 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 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.
# 进一步查看集群配置,并进行测试
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:47
cluster_stats_messages_pong_sent:46
cluster_stats_messages_sent:93
cluster_stats_messages_ping_received:41
cluster_stats_messages_pong_received:47
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:93
127.0.0.1:6379> cluster nodes
7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379@16379 slave 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 0 1600572760036 6 connected
7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379@16379 master - 0 1600572761038 3 connected 10923-16383
13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379@16379 myself,master - 0 1600572759000 1 connected 0-5460
21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379@16379 slave 7e00472bdc843f274d065f252126f889bb025e64 0 1600572759535 4 connected
9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379@16379 slave 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 0 1600572760537 5 connected
0348f1bc9463455ba3cf6c796297eaf301c2c5ef 172.38.0.12:6379@16379 master - 0 1600572760537 2 connected 5461-10922
# 关于redis集群高可用的简单测试
127.0.0.1:6379> set msg "hello,I like your blog!" 设置值
-> Redirected to slot [6257] located at 172.38.0.12:6379
OK
172.38.0.12:6379> get msg //取值
"hello,I like your blog!"

//用docker stop模拟存储msg值的redis主机宕机
[root@instance-001 panhom]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                              NAMES
705e41851450        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp   redis-6
89844e29f714        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp   redis-5
8f1ead5ca10a        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp   redis-4
f77c5d93a97a        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   21 minutes ago      Up 21 minutes       0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp   redis-3
cc2a93a6b4dd        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   21 minutes ago      Up 21 minutes       0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp   redis-2
6c9c3b813129        redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   26 minutes ago      Up 26 minutes       0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp   redis-1
[root@instance-001 panhom]# docker stop redis-2
redis-2

//重新进入集群交互界面,并尝试获取msg消息
/data # exit
[root@instance-001 panhom]# docker exec -it redis-1 /bin/sh
/data # redis-cli -c
127.0.0.1:6379> get ms
-> Redirected to slot [13186] located at 172.38.0.13:6379
(nil)
172.38.0.13:6379> get msg
-> Redirected to slot [6257] located at 172.38.0.16:6379 //此时由备用机返回msg
"hello,I like your blog!"


posted @ 2021-03-06 22:23  皮皮龙喔  阅读(394)  评论(0)    收藏  举报