:文件路径
//查看容器IP
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos
~~~
# 3. docker 部署练习
## 3.1 部署 nginx
```bash
# 下载 nginx 镜像
[root@izbp10tup89om84qulgxbsz ~]# docker pull nginx
# 启动 nginx 镜像
# -d 表示后台运行
# --name 给容器命名
# -p 暴露端口 格式:宿主机端口:容器内部端口
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name nginx01 -p:3344:80 nginx
# 本机测试连接(出现 Welcome to nginx! 即表示连接成功)
[root@izbp10tup89om84qulgxbsz ~]# curl localhost:3344
```
**外网测试连接:**

```bash
# 查看容器
[root@izbp10tup89om84qulgxbsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
061942db0498 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:3344->80/tcp nginx01
# 进入 nginx 容器
[root@izbp10tup89om84qulgxbsz ~]# docker exec -it nginx01 /bin/bash
root@061942db0498:/#
# 在容器中查找 nginx 配置文件
root@061942db0498:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 退出容器
root@061942db0498:/# exit
exit
# 停止容器
[root@izbp10tup89om84qulgxbsz ~]# docker stop 061942db0498
061942db0498
```
## 3.2 部署 tomcat
```bash
# 下载镜像
[root@izbp10tup89om84qulgxbsz ~]# docker pull tomcat
# 查看本地镜像
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest dab3cf97dd54 4 days ago 648MB
# 启动镜像
[root@izbp10tup89om84qulgxbsz ~]# docker run -d -p 3355:8080 tomcat01 tomcat
# 本地访问
[root@izbp10tup89om84qulgxbsz ~]# curl localhost:3355
HTTP Status 404 – Not FoundHTTP Status 404 – Not Found
Type Status Report
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
Apache Tomcat/9.0.39
\
```
**外网测试访问(连接成功,但是报404,因为这个 tomcat 是被阉割的):**

## 3.3 部署 elastic search
```bash
# 下载运行elasticsearch镜像
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 发现并没有成功运行(原因是elastsearch极耗内存,而我的服务器内存不够)
[root@izbp10tup89om84qulgxbsz /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 如果你和我一样,服务器内存不够用,建议使用下面的命令限制内存启动 elasticsearch
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 启动后可以使用如下命令查看容器的内存占用情况:
[root@izbp10tup89om84qulgxbsz /]# docker stats 784a6bb21c2d
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
784a6bb21c2d elasticsearch 0.39% 359.9MiB / 1.796GiB 19.57% 0B / 0B 265MB / 696kB 42
# 本地访问es
[root@izbp10tup89om84qulgxbsz /]# curl localhost:9200
```
- **(补充)Portainer 可视化面板的安装:**
```bash
# 下载并运行 Portainer
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
# 内网访问(会很快)
[root@izbp10tup89om84qulgxbsz /]# curl localhost:8088
```
**外网访问8088端口(第一次访问会非常非常慢):**

**第一次访问,需要添加用户名和密码:**


**看看就好,反正不好用:**

# 4. 数据卷技术
**Docker04_使用数据卷技术实现容器内外和容器间的数据共享**
## 4.1 使用 -v 命令挂载目录:
```bash
[root@izbp10tup89om84qulgxbsz home]# docker run -it -v /home/ceshi:/home centos /bin/bash
```
此时,容器内的 **/home** 目录就与主机的 **/home/ceshi** 目录实现了双向绑定。
即使容器被关闭或删除了,数据依然可以保留。
使用 **docker inspect 容器id** 命令可以查看到详细的目录挂载信息:
```bash
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
```
## 4.2 实战:MySQL同步数据
```bash
#搜索镜像
[root@izbp10tup89om84qulgxbsz ceshi]# docker search mysql
#下载镜像
[root@izbp10tup89om84qulgxbsz ceshi]# docker pull mysql:5.7
# 查看是否下载成功
[root@izbp10tup89om84qulgxbsz ceshi]# docker images
# 启动 mysql 镜像
-d 表示后台运行
-p 表示端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名
[root@izbp10tup89om84qulgxbsz ceshi]# 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
```
**Navicat 测试连接:**

**使用 Navicat 创建一个 test-blu 数据库:**

**进入主机的 /home/mysql/data 目录查看文件,发现多了一个名为 test@002dblu 的目录:**
```bash
[root@izbp10tup89om84qulgxbsz data]# ls
auto.cnf client-key.pem ib_logfile1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu
ca.pem ibdata1 mysql server-cert.pem
client-cert.pem ib_logfile0 performance_schema server-key.pem
12345
# 删除 mysql01 容器
[root@izbp10tup89om84qulgxbsz data]# docker rm -f mysql01
# 查看是否删除成功
[root@izbp10tup89om84qulgxbsz data]# docker ps -a
# 查看主机的 /home/mysql/data 目录,发现文件仍然存在
[root@izbp10tup89om84qulgxbsz data]# ls
auto.cnf client-key.pem ib_logfile1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu
ca.pem ibdata1 mysql server-cert.pem
client-cert.pem ib_logfile0 performance_schema server-key.pem
```
**具名挂载 和 匿名挂载**
```txt
指定路径挂载 -v 主机目录:容器目录
具名挂载 -v 卷名:容器目录
匿名挂载 -v 容器目录
```
**匿名挂载 nginx 示例(不推荐):**
```bash
# 匿名挂载启动 nginx
-P 表示随机端口映射
[root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的 volume
[root@izbp10tup89om84qulgxbsz home]# docker volume ls
DRIVER VOLUME NAME
local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
# 查看指定的 volume 信息
[root@izbp10tup89om84qulgxbsz home]# docker volume inspect f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
[
{
"CreatedAt": "2020-11-11T21:36:18+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b/_data",
"Name": "f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b",
"Options": null,
"Scope": "local"
}
]
[root@izbp10tup89om84qulgxbsz home]# docker volume inspect fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
[
{
"CreatedAt": "2020-11-18T18:27:24+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65/_data",
"Name": "fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65",
"Options": null,
"Scope": "local"
}
]
```
**结论:所有 docker 容器内的卷,在没有指定主机目录的情况下,默认挂载的地址都是:**
**"/var/lib/docker/volumes/【volumn-name】/_data"**
问题是匿名挂载的 volumn 的 名字都是一长串的随机字符,我们无法判断哪一个才是 nginx 容器挂载的地址,使用具名挂载可以解决这个问题。
**具名挂载 nginx 示例(推荐):**
```bash
# 具名挂载启动 nginx
[root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看所有的 volume
[root@izbp10tup89om84qulgxbsz _data]# docker volume ls
DRIVER VOLUME NAME
local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
local juming-nginx
# 查看指定的 volume 信息
[root@izbp10tup89om84qulgxbsz _data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-11-18T18:46:47+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
# 进入挂载目录查看文件,找到了 nginx 的配置文件!
[root@izbp10tup89om84qulgxbsz _data]# cd /var/lib/docker/volumes/juming-nginx/_data
[root@izbp10tup89om84qulgxbsz _data]# ll
total 40
drwxr-xr-x 2 root root 4096 Nov 18 18:46 conf.d
-rw-r--r-- 1 root root 1007 Oct 27 23:09 fastcgi_params
-rw-r--r-- 1 root root 2837 Oct 27 23:09 koi-utf
-rw-r--r-- 1 root root 2223 Oct 27 23:09 koi-win
-rw-r--r-- 1 root root 5231 Oct 27 23:09 mime.types
lrwxrwxrwx 1 root root 22 Oct 27 23:25 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root 643 Oct 27 23:25 nginx.conf
-rw-r--r-- 1 root root 636 Oct 27 23:09 scgi_params
-rw-r--r-- 1 root root 664 Oct 27 23:09 uwsgi_params
-rw-r--r-- 1 root root 3610 Oct 27 23:09 win-utf
```
**拓展:**
```bash
默认rw挂载的目录可读可写,可以在容器内部对挂载的目录内的文件进行读写:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:rw
设置读写权限为ro(readOnly)的挂载目录,不可以在容器内对该目录内的文件进行写操作:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:ro
```
## 4.3 具名和匿名挂载
### 匿名
~~~bash
docker run -d -P --name naginx-1 -v /ect/nagix nginx
~~~
不写路径,然后docker 自动生成路径进行挂载
### 具名
~~~bash
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix nagix
~~~
写路径的,但是路径并不是绝对路径,而是卷名
查看卷名
~~~bash
docker volume inspect
~~~
### 拓展
~~~bash
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:ro nagix
~~~
ro readonly 只读,只能进行宿主机来改变
~~~bash
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:rw nagix
~~~
rw readwrite 可读可写
# 5. DockerFile
> dockerfile 就是构建docker镜像的构建文件,命令脚本
## 5.1 使用 dockerfile 挂载目录
在 /home 目录下新建 docker-test-volume 目录,进入该目录
在 /home/docker-test-volume 目录下,创建 dockerfile1 文件,写入以下内容:
~~~bash
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
~~~
测试
```bash
# 根据 dockerfile1 中的脚本创建镜像,镜像名为 docker-blu/centos 版本为1.0
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t docker-blu/centos:1.0 .
# 查看生成的镜像
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-blu/centos 1.0 65d304aadb42 43 seconds ago 215MB
# 启动自己创建的镜像
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker run -it 65d304aadb42 /bin/bash
# 查看目录,发现了挂载的目录 volume01 和 volume02
[root@c1a21b8c0d30 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 Nov 18 11:31 dev
drwxr-xr-x 1 root root 4096 Nov 18 11:31 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 97 root root 0 Nov 18 11:31 proc
dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Nov 18 11:31 sys
drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
drwxr-xr-x 20 root root 4096 Aug 9 21:40 var
drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume01
drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume02
# 在 volume01 中创建一个文件
[root@c1a21b8c0d30 /]# cd volume01
[root@c1a21b8c0d30 volume01]# touch a.txt
# 查看容器id
[root@izbp10tup89om84qulgxbsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1a21b8c0d30 65d304aadb42 "/bin/bash" 7 minutes ago Up 7 minutes festive_cerf
# 查看挂载点信息
[root@izbp10tup89om84qulgxbsz ~]# docker inspect c1a21b8c0d30
"Mounts": [
{
"Type": "volume",
"Name": "3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027",
"Source":"/var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342",
"Source": "/var/lib/docker/volumes/61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
# 进入 volume01 挂载的主机目录,发现同步成功!
[root@izbp10tup89om84qulgxbsz ~]# cd /var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data
[root@izbp10tup89om84qulgxbsz _data]# ls
a.txt
[root@izbp10tup89om84qulgxbsz _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1a21b8c0d30 65d304aadb42 "/bin/bash" 24 minutes ago Up 24 minutes festive_cerf
# 再启动一个容器,卷继承上一个容器
[root@izbp10tup89om84qulgxbsz _data]# docker run -it --name blu-centos02 --volumes-from c1a21b8c0d30 65d304aadb42 /bin/bash
# 进入 volume01 目录,发现了a.txt
[root@9740c6ea3675 volume01]# ls
a.txt
# 创建 b.txt
[root@9740c6ea3675 volume01]# touch b.txt
# 在之前的容器中发现了b.txt,同步成功!
[root@c1a21b8c0d30 volume01]# ls
a.txt b.txt
```
## 5.2 实战:使用数据卷容器实现多个MySQL的数据同步
```bash
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
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
```

**DockerFile**
> - **DockerFile 就是一个命令参数脚本,是用来构建docker镜像的文件**
> - **每个保留关键字(指令)都必须是大写字母**
> - **# 号表示注释**
> - **每一个指令都会创建提交一个新的镜像层**
### DockerFile 的指令
```bash
FROM # 指定基础镜像
MAINTAINER # 指定维护者信息(姓名+邮箱)
RUN # 镜像构建时需要运行的命令
ADD # 在镜像中添加内容
WORKDIR # 设置当前工作目录
VOLUME # 设置卷,挂载主机目录
EXPOSE # 指定暴露端口
CMD # 指定容器启动时要运行的命令(只有最后一个CMD指令会生效)
ENTRYPOINT # 指定容器启动时要运行的命令,启动时可以追加命令参数
ONBUILD # 当构建一个被继承 DockerFile 时会执行的指令
COPY # 类似ADD,将文件拷贝至镜像中
ENV # 构建时设置环境变量
```
## 5.3 制作自己的镜像
### 5.3.1 创建一个自己的 CentOS 镜像:
编辑命令
~~~bash
vim mydockerfile-centos
~~~
输入命令
~~~bash
FROM centos
MAINTAINER BLU<2711978737@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
~~~
开始构建自己的centos
```bash
docker build -f mydockerfile-centos -t mycentos:0.1 .
```
**docker history 命令查看指定镜像的构建过程(以mysql:5.7为例):**
```bash
[root@blu ~]# docker history mysql:5.7
IMAGE CREATED CREATED BY SIZE COMMENT
c791733bf9b7 4 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
4 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
4 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
4 days ago /bin/sh -c #(nop) COPY file:f9202f6b715c0e78… 13.1kB
4 days ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
4 days ago /bin/sh -c { echo mysql-community-server m… 313MB
4 days ago /bin/sh -c echo "deb http://repo.mysql.com/a… 55B
4 days ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.32-… 0B
4 days ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B
4 days ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 2.61kB
4 days ago /bin/sh -c apt-get update && apt-get install… 52.2MB
4 days ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
4 days ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB
4 days ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
4 days ago /bin/sh -c apt-get update && apt-get install… 9.34MB
4 days ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
4 days ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB
```
#### 可能出现的问题
Errors during downloading metadata for repository ‘AppStream‘解决方法
> 在阿里云服务器centos7上,Dockerfile中写了一句RUN yum -y install vim,结果build的时候就一直出错
> 
> 最后是发现因为把防火墙关了,把防火墙打开就可以了。
> systemctl start firewalld.service
> 1. vim CentOS-Base.repo
> 2. vim CentOS-AppStream.repo
> 3. vim CentOS-Extras.repo
>
> 将文件中三文件中的 mirrorlist注释,将baseurl 修改为阿里源
> 为 baseurl=
>
> ~~~bash
> https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
> ~~~
>
> ~~~bash
> yum makecache
> ~~~
>
> ~~~bash
> systemctl restart docker
> ~~~
### 5.3.2 创建一个 Tomcat 镜像:
~~~bash
FROM centos
MAINTAINER BLU<2711978737@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-aarch64.tar.gz /usr/local/
ADD apache-tomcat-9.0.34.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN chmod -R 777 /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.34
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.34
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.34/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.34/logs/catalina.out
~~~
~~~bash
[root@blu tomcat]# docker build -t diytomcat .
[root@blu blu]# docker run -d -p 3001:8080 --name blu-diytomcat -v /usr/blu/tomcat/test/webapps:/usr/local/apache-tomcat-9.0.34/webapps -v /usr/blu/tomcat/test/tomcatlogs:/usr/local/apache-tomcat-9.0.34/logs diytomcat
~~~
### 5.3.3 在DockerHub上发布自己的镜像
- **第一步:先在这个网站注册一个账号:https://hub.docker.com/**
- **第二步,在服务器上登录账号:**
```bash
[root@blu tomcat]# docker login -u blucoding
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
```
- **第三步,将自己的镜像改名为标准格式:【作者名】/【镜像名】:版本号**
- **注意作者名要和你刚刚注册的账号名一致,否则会被拒绝提交**
```bash
docker tag 0d120b6ccaa8 blucoding/centos:1.0
```
- **第四步,提交镜像**
```bash
docker push blucoding/centos:1.0
```
### 5.3.4 阿里云镜像服务上发布自己的镜像
- **第一步,在阿里云的容器镜像服务中创建一个命名空间:**

- **第二步,创建一个镜像仓库:**


- **第三步,点击镜像仓库查看详细信息和操作指南:**

- **第四步,在服务器上退出刚刚登录的 dockerhub 账户:**
```bash
docker logout
```
- **第五步,登录阿里云账户,密码是阿里云镜像仓库服务的密码:**
```bash
sudo docker login --username=杀手的假期 registry.cn-hangzhou.aliyuncs.com
```
- **第六步,修改镜像名称:**
```bash
sudo docker tag [镜像id] registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]
```
- **第五步,发布镜像:**
```bash
sudo docker push registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]
```
# 6.Docker 网络
~~~bash
ip addr
~~~

一共有三个网卡
lo 是自己本身的,eth0 是 阿里云服务器创建的,docker0是 dokcer创建的网卡,用来管理网络
## 6.1 桥接模式

> 只要安装了docker,就会分配一个ip地址,就是桥接模式。使用的技术是evth-pair 技术
再次输入
~~~bash
ip addr
~~~

> **每次启动一个容器,就会多一个网卡。这就是evth-pair 技术**
>
> **容器和容器之间是可以ping 通的**
容器与容器之间能够用ip ping通,但是不能够用 名字ping 通
## 6.2 容器连接--link
> 使用了link ,就能够用 名字进行ping 通了
先删除container
~~~bash
docker rm tomcat01
docker rm tomcat02
~~~
创建
~~~shell
docker run -d --name tomcat01 tomcat
docker run -d --name tomcat02 --link tomcat01 tomcat
~~~
ping
~~~bash
docker exec -it tomcat02 ping tomcat01
~~~
但是,反向不能够ping 通
~~~bash
docker exec -it tomcat01 ping tomcat02
~~~
## 6.3 自定义网络
> 查看所有的docker 网络

网络模式
* bridge 桥接模式,默认
* none 不设置热呢配置
* host 和宿主机连接配置
* container 容器间连通(局限很大)
### 创建自定义网络
~~~bash
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynetwork
~~~
查看

查看具体信息

### 创建容器连接上自定义网络
~~~bash
docker run -d -P --name tomcat-net-01 --net mynetwork tomcat
docker run -d -P --name tomcat-net-02 --net mynetwork tomcat
~~~
检查网络,就会发现,服务已经在上面

~~~xml
[
{
"Name": "mynetwork",
"Id": "ac8e8f17715318a7b238e1a54e8be50f1d1953b305b6c2318e622a69de7efbbe",
"Created": "2021-01-05T11:01:40.300113826+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/24",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"5948c7b4c7cdce9e5b5f29611069a18e0c6931e161f6ac66c1754c118ec390e2": {
"Name": "tomcat-net-02",
"EndpointID": "dd8281b34a371ec6b0dcb8ba4d1b742c957fd0f8a1a1c4f22f807ea239f296a2",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/24",
"IPv6Address": ""
},
"c29a840804c9a73933649dbe7db2310471bb21a58f6ec6111818f0c673d87e1a": {
"Name": "tomcat-net-01",
"EndpointID": "482dddfbda360b55735730841bf3f6200df84798b1449d4886abe4c251538f75",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
~~~
### 测试
~~~bash
docker exec -it tomcat-net-01 ping tomcat-net-02
~~~
## 6.4 网络连通

实现docker0 和mynet 连通


~~~bash
docker network connect mynetwork tomcat01
~~~
实现效果
就是把tomcat01 放置在了上面

> 文章链接 https://gitee.com/fakerlove/docker
@[TOC]
# 7. Docker-Compose
## 7.1 介绍
### 7.1.1 概念
> Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
> Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
### 7.1.2 安装
安装官网
~~~bash
https://docs.docker.com/compose/install/
~~~
安装在centos 上
* 需要以下安装环境
`py-pip`,`python-dev`,`libffi-dev`,`openssl-dev`,`gcc`,`libc-dev`,和`make`。
* 下载
```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
建议使用备用地址
```bash
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```
* 设置权限
```bash
sudo chmod +x /usr/local/bin/docker-compose
```
* 设置快捷方式
```bash
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```
* 检查是否成功
```bash
docker-compose --version
```
如果下载太慢的话,使用这个
```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
```
或者直接使用pip 安装
centos7 可以选择如下安装
```bash
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version
```
centos8 需要使用pip3 命令安装
~~~bash
sudo pip3 install docker-compose
~~~
## 7.2 使用
- 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
- 定义组成应用程序的服务,`docker-compose.yml` 以便它们可以在隔离的环境中一起运行。
- 运行 `docker-compose up` Compose启动并运行您的整个应用程序。
`docker-compose.yml` 长成这样子
````yml
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
````
### 7.2.1 快速开始
~~~bash
mkdir composetest
cd composetest
~~~
创建app.py
~~~python
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
~~~
同目录下创建requirements.txt
~~~txt
flask
redis
~~~
创建Dockerfile
~~~dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
~~~
内容讲解
~~~bash
从Python 3.7映像开始构建映像。
将工作目录设置为/code。
设置flask命令使用的环境变量。
安装gcc和其他依赖项
复制requirements.txt并安装Python依赖项。
向图像添加元数据以描述容器正在侦听端口5000
将.项目中的当前目录复制到.映像中的工作目录。
将容器的默认命令设置为flask run。
~~~
创建docker-compose.yml
~~~yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
~~~
目录

启动
~~~bash
docker-compose up
~~~
观察连接
~~~bash
http://localhost:5000/
~~~
### 7.2.2 搭建自己的博客wordpress
```bash
mkdir my_wordpress
cd my_wordpress
```
创建 docker-compose.yml
~~~yaml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
~~~
启动项目
~~~bash
docker-compose up -d
~~~
### 7.2.3 搭建redis 集群
抄袭别人的
~~~bash
mkdir -p docker/redis docker/sentinel
cd docker/redis
touch docker-compose.yml
~~~
下一步编辑docker-compose.yml
~~~yaml
version: '3'
services:
master:
image: redis
container_name: redis-master
command: redis-server --requirepass 123456
ports:
- 6379:6379
slave1:
image: redis
container_name: redis-slave-1
ports:
- 6380:6379
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
slave2:
image: redis
container_name: redis-slave-2
ports:
- 6381:6379
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
~~~
进入
~~~
cd ../sentinel
touch docker-compose.yml sentinel.conf
~~~
编辑docker-compose.yml
~~~bash
version: '3'
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
~~~
编辑 sentinel.conf
~~~bash
port 26379
dir /tmp
sentinel monitor mymaster 172.19.55.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster 123456
~~~
注意点
> ① 第三行中 mymaster 是可以自定义集群的名字,如果使用其他语言连接集群,需要写上该名字。
>
> ② 192.168.223.129是我虚拟机的ip,请换成自己的ip,不要127.0.0.1 否则会链接到你的应用程序去,写IP就可以。
>
> ③ 那个2呢,是因为我有3台哨兵,2个投票超过50%了,所以设置2即可,如果是更多,设置超过50%概率就好,自己喜欢。
复制
~~~bash
sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf
~~~

查看sentinel

分别启动 进入redis 中
~~~bash
cd /usr/local/docker/redis
~~~
启动
~~~bash
sudo docker-compose up -d
~~~
进入sential
~~~bash
cd /usr/local/docker/sentinel/
~~~
启动
~~~bash
sudo docker-compose up -d
~~~
查看是否成功
~~~bash
docker ps
~~~