本文是紧接着上一节 docker入门与实战
# 查看容器支持的网络模式
docker network ls
# 指定网络模式启动容器
docker run -d --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
使用场景,企业应用服务,与mysql数据库服务。两个服务分别部署不同容器,但是只需要企业应用服务能访问mysql数据库服务,反过来则没有必要
解决方案:容器间基于Link实现单向通信
# 启动mysql服务 必须指定名字
docker run --name=mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mycentos:mysql
# 启动一个应用(此处用centos7代替) link mysql容器
docker run -itd --name=mycentos --link mymysql centos:7
# 使用命令查看 mycentos 与 mymysql 容器ip, 属性为 Networks.bridge.IPAddress
docker inspect mymysql # 172.17.0.2
docker inspect mycentos # 172.17.0.4
# 进入mycentos ping mymysql
docker exec -it mymysql /bin/bash
[root@7ed31839001e /]# ping mymysql
PING mymysql (172.17.0.2) 56(84) bytes of data.
64 bytes from mymysql (172.17.0.2): icmp_seq=1 ttl=64 time=0.281 ms
64 bytes from mymysql (172.17.0.2): icmp_seq=2 ttl=64 time=0.172 ms
# 进入mymysql ping mycentos
docker exec -it mymysql /bin/bash
# 由于此mysql镜像是基于debian而不是基于centos所以需要安装ping命令工具
apt-get update && apt-get install net-tools && apt install -y iputils-ping
# ping mycentos
root@7ea8c4cbed8b:/docker-entrypoint-initdb.d# ping mycentos
ping: mycentos: Name or service not known
root@7ea8c4cbed8b:/docker-entrypoint-initdb.d#
link 总结,其实就是将 link 的容器的ip地址与容器名 记录到本地。类似于本地hosts 文件或者说是 DNS 解析。
使用场景,企业应用服务,相互之间需要有网络通信。
解决方案:容器间基于brige网桥实现双向通信
# 创建一个网桥
docker network create -d bridge my_bridge
# 查看网络模式
docker network ls
# 启动两个应用(此处使用centos模拟应用)
docker run -itd --name mycentos1 centos:7
docker run -itd --name mycentos2 centos:7
# 将两个容器加入网桥
docker network connect my_bridge mycentos1
docker network connect my_bridge mycentos2
# 进入mycentos1 验证
[root@192 ~]# docker exec -it mycentos1 /bin/bash
[root@68636b2df7b0 /]# ping mycentos2
PING mycentos2 (172.18.0.3) 56(84) bytes of data.
64 bytes from mycentos2.my_bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.155 ms
64 bytes from mycentos2.my_bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.113 ms
# 进入 mycentos2 验证
[root@192 ~]# docker exec -it mycentos2 /bin/bash
[root@bfb5a0fb4898 /]# ping mycentos1
PING mycentos1 (172.18.0.2) 56(84) bytes of data.
64 bytes from mycentos1.my_bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.188 ms
64 bytes from mycentos1.my_bridge (172.18.0.2): icmp_seq=2 ttl=64 time=0.084 ms
容器之间使用 Volume 来实现数据共享
# 创建第一台ngnix容器
docker run -itd --name=mynginx1 -p 8081:80 -v /root/nginx/html:/usr/local/ mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
# 创建第二台 使用--volumes-from mynginx1 共用第一台的卷
docker run -itd -p 8082:80 --volumes-from mynginx1 --name=mynginx2 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
# 创建第三台 使用--volumes-from mynginx1 共用第一台的卷
docker run -itd -p 8083:80 --volumes-from mynginx1 --name=mynginx3 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
# 三台nginx 访问目录全部挂载到宿主机 /root/nginx/html 在此目录下创建 index.html
http://192.168.101.10:8081/
http://192.168.101.10:8082/
http://192.168.101.10:8083/
# 三台nginx访问的内容一致,并且 index.html 发生改变,三个地址内容一起发生改变
docker-compose 是一个用于定义和运行多容器 Docker 的应用程序工具,可以帮助我们可以轻松、高效的管理容器
# 工具依赖Python环境
yum install -y epel-release
yum install -y python-pip
# 安装 docker-compose
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose==1.24.1
# 检查是否安装成功
docker-compose version
version: '3'
services:
conginx:
image: mycentos:nginx
network_mode: "host"
volumes:
- /home:/usr/local/nginx/html
- /var/logs/nginx/logs:/usr/local/nginx/logs
command: /usr/local/nginx/sbin/nginx -g "daemon off;"
coredis:
image: mycentos:redis
ports:
- "6380:6379"
# 在当前目录下启动容器 (-d 后台启动)
docker-compose up -d
# 查看进程
docker-compose ps
# 删除并停止容器 (----volumes)
# --volumes 并删除volume
docker-compose down
# 停止启动容器
docker-compose stop
# 启动容器
docker-compose start
# 进入容器 (指定的名称为yml 中services 标签下的名字)
docker-compose exec congnix bash
参考官方例子
version: '3.3'
services:
db:
#docker run -itd mysql:5.7
image: mysql:5.7
volumes:
#采用的是卷标的形式挂载(注意:- db_data是参数,可以变,自定义,必须与下面对应)
- db_data:/var/lib/mysql
#自动重启,保证服务在线
restart: always
#指定环境变量 docker -itd -e
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
# - 依赖服务,合起来的意思是只有当上面的db服务也就是mysql数据库安装成功后,这个wordpress才可以被安装,还有一个功能,就是docker --link 将上面的mysql数据库,与这个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: {}
# 启动容器
docker-compose up -d
# 访问 ip:8000 访问
# 安装WordPress
# 查看所有的卷标
docker volume ls
# 查看WordPress 挂载的位置
docker volume inspect wordpress_db_data
搭建自己的镜像仓库需要有机器,过程稍微复杂一些,如今有许多的云厂商,免费给我们提供自己的镜像仓库,例如阿里云,腾讯云。所以总结来说搭建方式有两种。第一,自己搭建。第二,使用云厂商提供的个人私有镜像仓库。
# 本地验证身份 在终端中输入访问凭证,登录Registry实例 (这个是一个例子,你的不一样)
sudo docker login --username=阿里云账号 registry.cn-shenzhen.aliyuncs.com
# 打tag(改名)
sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:[镜像版本号]
sudo docker tag 5fa5ca3bcd14 registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:v1
# 推送镜像至远程仓库
sudo docker push registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:[镜像版本号]
sudo docker push registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:v1
# 从远程仓库拉去镜像
sudo docker pull registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:[镜像版本号]
sudo docker pull registry.cn-shenzhen.aliyuncs.com/docker-qzcsu/myng:v1
cd harbor
vi harbor.yml
#将hostname 修改成当前服务器的地址
hostname: 192.168.101.10
# 将管理员密码设置
harbor_admin_password: a12345
sh prepare
# 安装完成后 会自动启动 harbor
sh install.sh
# 查看 harbor 的相关容器进程
docker-compose ps
# 1.默认docker只允许访问 https仓库,需要 进行配置 /etc/docker/daemon.json
# 添加如下配置
{
"insecure-registries":["http://192.168.101.10"]
}
# 重启容器服务
systemctl restart docker.service
# 2. 进入 192.168.101.10:80 创建一个仓库 my-repository
# 3. 登录
docker login --username=admin 192.168.101.10
# 4. 打tag
docker tag SOURCE_IMAGE[:TAG] 192.168.101.10/my-repository/IMAGE[:TAG]
docker tag mysql:5.7 192.168.101.10/my-repository/mmsql:v1
# 5. 推送镜像
docker push 192.168.101.10/my-repository/IMAGE[:TAG]
docker push 192.168.101.10/my-repository/mmsql:v1
# 6. 拉取镜像
docker pull 192.168.101.10/my-repository/mmsql:v1
登录会在 /root/.docker/config.json 记录登录信息 (建议从安全角度出发,每次登录后进行删除)
本文主要介绍了 docker的进阶使用,docker的网络模式,文件共享,镜像仓库。