docker进阶与实战

环境说明


本文是紧接着上一节 docker入门与实战


docker的网络模式

  • host 主机模式。该网络模式下容器不会拥有自己的ip地址,而是使用宿主机的ip地址和端口,因此不存在宿主机与容器端口映射。
  • bridge 桥接模式(默认)。桥接模式是,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥。后续启动的所有容器实例都会与docker0网桥在一个网段上。所有容器实例通过docker0网桥和宿主机进行网络通信。
  • none 无网络模式。关闭网络连接,无法连接外网。
# 查看容器支持的网络模式
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 来实现数据共享

实战-3台nginx 集群,挂载到相同目录

# 创建第一台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 发生改变,三个地址内容一起发生改变

Compose 高效管理容器

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

基本概念

  • docker-compose 基于.yml 文件操作容器,执行docker-compose 命令时当前目录下必须有对应docker-compose.yml 或者docker-compose.yaml文件
  • yml 文件包含三大部分 version,services,networks。
  • docker-compose 可以操作各种docker的原生功能 例如,网络模式,端口映射等。

实战1–搭建一个redis+一个nginx

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

实战2–搭建一个速搭建个人博客wordpress

参考官方例子

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

Docker镜像仓库

镜像仓库关系

docker进阶与实战_第1张图片

搭建自己的镜像仓库

搭建自己的镜像仓库需要有机器,过程稍微复杂一些,如今有许多的云厂商,免费给我们提供自己的镜像仓库,例如阿里云,腾讯云。所以总结来说搭建方式有两种。第一,自己搭建。第二,使用云厂商提供的个人私有镜像仓库。

搭建阿里云镜像仓库

  1. 申请镜像仓库使用权。传送门 需要有阿里云账号进行登录,还要设置独立的 Registry 密码,此密码就是等下我们推镜像的时候需要进行身份验证的。
  2. 创建命名空间,创建镜像仓库。例子,命名空间 docker-qzcsu。 镜像仓库名 myng。
  3. 推送镜像。此步骤注意先获取登录凭证。
# 本地验证身份 在终端中输入访问凭证,登录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

自建docker镜像仓库(harbor仓库)

安装 harbor

  1. 环境检查。需要安装docker、docker-compose、openssl以及python2.7以上。
  2. 安装openssl。yum -y install openssl
  3. 下载安装包 github地址。harbor 有在线安装与离线安装两种模式。采用在线安装太慢,我们采用下载离线包进行离线安装(推荐使用迅雷进行下载相对较快)。
  4. 将包上传到机器进行解压得到目录 harbor。
  5. 修改配置文件。修改 hostname 与密码。修改配置文件注意遵从 yml 文件语法
cd harbor
vi harbor.yml
#将hostname 修改成当前服务器的地址
hostname: 192.168.101.10
# 将管理员密码设置
harbor_admin_password: a12345
  1. 在解压后的目录执行 prepare 脚本,生成 docker-compose.yml
sh prepare
  1. 安装。 在解压目录执行安装脚本
# 安装完成后 会自动启动 harbor
sh install.sh
# 查看 harbor 的相关容器进程
docker-compose ps
  1. 访问 host:80

harbor 配置与使用

# 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的网络模式,文件共享,镜像仓库。

你可能感兴趣的:(实战演练)