docker基本应用

docker

安装

#下载Centos 7 基础镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
#下载epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
#下载docker-ce源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

#执行安装
yum remove -y docker-ce  docker-common  docker-selinux docker-engine container-selinux containerd.io
yum -y install docker-ce

#启动
systemctl start docker
systemctl enable docker

#配置镜像加速器
#docker中国官方加速器
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF

#重新加载配置
systemctl reload docker

#确认安装
docker --version
docker info

docker基本使用

docker是一个软件打包技术,架构为C/S架构,包含客户端和服务端。

仓库:自定义镜像仓库

镜像:一次镜像处处运行

容器:运行镜像

[root@oldboy ~]# docker --version
Docker version 19.03.10, build 9424aeaee9

[root@oldboy ~]# docker info 
Client:
 Debug Mode: false

Server:
 Containers: 4
  Running: 1
  Paused: 0
  Stopped: 3
 Images: 4
 Server Version: 19.03.10
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 972.6MiB
 Name: oldboy
 ID: TZWK:GEIN:LZGW:CRL3:6K5K:MVQ5:QVGQ:EEX5:QYHP:NYNK:G4QD:AI5L
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://registry.docker-cn.com/
 Live Restore Enabled: false

使用

#容器的打包技术:在不安装nginx的情况下,启用nginx容器,就可以正常使用nginx服务。
docker run -d -p 80:80 nginx:lastest
docker images

docker images 列出本机上的镜像

repository --表示镜像的仓库源

tag --表示镜像的标签

image id --镜像的ID

create --镜像的创建时间

size --镜像的大小

参数

-a 列出本地的所有镜像及子镜像

-q 只显示镜像ID

–digests 显示镜像的摘要信息

–no-trunc 显示完整的镜像信息

docker search

从docker仓库中查找镜像,默认从/etc/docker/daemo.json文件中定义的路径中查找。

[root@oldboy ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
[root@oldboy ~]# docker search  nginx
NAME   DESCRIPTION               STARS      OFFICIAL            AUTOMATED
nginx  Official build of Nginx.    13914       ok                   

NAME :镜像名称

DESCRIPTION :描述

STARS :星级

OFFICIAL :是否官方

AUTOMATED :自定义

参数

–no-trunc 显示完整的镜像描述

-s 数字,列出收藏数字

–automated 只列出automated build类型构建的镜像

docker pull
docker search alpine                   #在线查找镜像
docker pull alpine                     #在线下载镜像
docker pull alpine:3.9
docker image ls  或者  docker images    #查看本地镜像列表

不标记镜像版本,默认下载最新的镜像(latest),镜像都是压缩文件,可以解压查看文件。可以将其导出,然后分析该镜像的文件内容和设置。

docker save
docker save  nginx:latest -o docker_nginx.tar.gz

-o 导出镜像的名称

导出的镜像也可以执行导入

docker load -i docker_nginx.tar.gz
镜像加速

为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
 systemctl restart docker
docker tag
docker tag centos  centos:v01
docker run
docker run -d -it centos:6.9  [初始命令]
docker run  -it --name oldboy  --rm  alpine:latest /bin/bash
  • 运行一个在后台执行的容器,同时,还能用控制台管理:docker run -i -t -d ubuntu:latest
  • 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:docker run -d ubuntu:latest ping www.docker.com
  • 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,docker run -d --restart=always ubuntu:latest ping www.docker.com
  • 为容器指定一个名字,docker run -d --name=ubuntu_server ubuntu:latest
  • 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
  • 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
run参数说明

run 有两个作用,创建并启动容器

-d 后台运行容器, 指定容器运行于前台还是后台,默认为false

-it 分配一个交互式的终端

–name 不指定名称的时候,容器启动是会产生随机的名称

–rm 表示运行退出之后执行容器删除操作

-v, --volume=[] , 给容器挂载存储卷,挂载到容器的某个目录

–volumes-from=[] ,给容器挂载其他容器上的存储卷

-e, --env 指定环境变量, 容器中可以使用该环境变量

–net=host 容器网络设置

  • ​ bridge:使用docker daemon指定的网络桥接
  • ​ host:使用容器主机网络
  • ​ container: NAME_or_ID 使用其他容器的网络
  • ​ none: 容器使用自己的网络(类似–net=bridge),但是不进行配置

–name="" ,指定容器的名称

–privileged=false ,指定容器是否为特权容器,特权容器拥有所有的capabilities

–restart=always 重启策略

  • ​ no
  • ​ on-failure
  • ​ always

-u, --user 指定容器的用户

-a, --attach 登录容器(必须是以docker run -d启动的容器)

-w, --workdir 指定容器的工作目录

-c, --cpu-shares=0 ,设置容器CPU权重,在CPU共享场景使用

-m, --memory=“” ,指定容器使用内存的上限

-P, --publish-all=false ,容器自动暴露的端口(大写P)

-p, --publish=[] 指定容器暴露的端口

-h,–hostname="" ,指定容器的主机名称

–cidfile="" , 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法

–cpuset="",设置容器可以使用那些CPU,此参数可以用来让容器独占CPU

–device=[] ,添加主机设备给容器,相当于设备直通,

–dns=[] ,指定容器的DNS服务器

–dns-search=[] , 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件

–expose=[] , 指定容器暴露的端口,即修改镜像的暴露端口

–link=[] , 指定容器间的关联,使用其他容器的IP、env等信息

–rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

–entrypoint="" ,覆盖images的入口点。

不加参数就是在前台运行。CTRL+C可以结束容器。

宿主机

容器共用宿主机的内核。因此docker只支持linux内核的发行版本。

宿主机是centos6.9的系统,而运行的容器不一定都是,因为会出现有些容器运行的命令可能会没有。但是所有的linux操作系统的内核都是一样的,因此可以正常运行,按照linux的发行版本的固有命令来执行。

centos  yum
debian  apt-get
ubuntu  apt-get
alpine  apk
suse    zypper
容器
docker container ls
docker ps                   #默认只现实运行中的容器
docker ps --all  或者  docker ps -a
docker ps -l                #-l只显示最后一个启动的容器

默认按照启动时间排序

create
docker create --name oldboy centos:6.9          #固定一个容器的名称
docker run -d -it --name oldgril centos:latest  #固定一个镜像的名称
start

可以启动create的容器,也可以启动run的容器

docker start [容器id/name]
docker start oldgril


docker run --name container_01 -i -t ubuntu:latest  /bin/bash
exit
docker start -i  container_01
stop

正常停止容器

docker  stop  [容器id/name]
restart
docker  stop  [容器id/name]
kill

能够强制关闭容器(进程)。

docker kill 
docker kill `docker ps -a -q`
删除容器rm
docker rm  [容器id/name]             #删除指定容器
docker rm  `docker ps -a -q`        #删除所有容器
docker rm -f  `docker ps -a -q`     #强制删除所有容器
attach再次进入运行中容器的方法

容器的ID默认为容器的主机名称

docker attach  #画面同步,在同一个终端运行,ctrl+p,ctrl+q离开。
docker run -it   #重启分配一个终端进入,画面不同步,相互操作不影响。
docker exec -it containerID  /bin/bash #使用docker exec命令,可以在容器中执行命令。
如何让容器持续运行

容器启动完成初始命令和任务之后,将会自动退出,可以继续start,相当于重新执行初始命令。如果没有初始命令,运行即停止。

docker -d -it centos:6.9  #可以持续运行,因为终端等待前台交互,终端运行也能满足容器持续运行

nginx -g ‘daemon off’ #前台运行全局命令

[root@oldboy ~]# docker run -d centos:6.9
80ca84fc204fb4e06868b8c080de6558b922b22e66f0e26db21e42fb21ab1b6e
[root@oldboy ~]# docker run -d centos:6.9 sleep 300
3f6909603a96ff02c6374cd2e56428b45f57863809deeac11760aa25002df572
[root@oldboy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3f6909603a96        centos:6.9          "sleep 300"         4 seconds ago       Up 3 seconds                            cool_williams
2fe21bc92b70        centos:6.9          "sleep 3600"        5 minutes ago       Up 5 minutes                            eager_hawking
[root@oldboy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3f6909603a96        centos:6.9          "sleep 300"         40 seconds ago      Up 39 seconds                                   cool_williams
80ca84fc204f        centos:6.9          "/bin/bash"         48 seconds ago      Exited (0) 47 seconds ago                       pensive_burnell
7bcd76128143        centos:6.9          "/bin/bash"         5 minutes ago       Exited (0) 5 minutes ago                        eager_noether
2fe21bc92b70        centos:6.9          "sleep 3600"        6 minutes ago       Up 6 minutes                                    eager_hawking
f2e0e9c2f83c        centos:6.9          "/bin/bash"         7 minutes ago       Exited (0) 6 minutes ago                        great_ellis

端口映射

安装完成docker-ce之后,会多一个docker0的网卡

5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:b6:fc:e0:f6 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:b6ff:fefc:e0f6/64 scope link 
       valid_lft forever preferred_lft forever

端口映射是nat地址转化的一种,让内网某台服务映射到外网能够访问。docker自己会完成端口映射规则的配置。

iptables -nL -t nat         #查看端口映射规则

docker 通过-p参数来设置端口映射。容器的端口映射只能在启动时添加,后续添加不太方便。

docker run -d -p 90:80 nginx   #将宿主机的90端口映射到容器的80端口上。
docker run -d -p 10.0.0.11:80:80 nginx:latest   #特定IP的80->80
docker run -d -p 10.0.0.11::80 nginx:latest   #随机端口访问到容器的80
docker run -d -p 10.0.0.11::80/udp nginx:latest
docker run -d -p 100-110:500-510 nginx:latest  #范围映射

-P (大写):会自动分配端口。

docker run -d -P nginx:latest
docker logs
docker 运行命令
docker run --name=container_01 -d ubuntu:latest /bin/sh  -c "while true; do echo hello world; sleep 1;done"
docker logs container_01 -f
docker logs container_01 -t

-f #持续跟进运行中的容器的输出日志

-t #显示出log日志每条记录的输出时间

docker exec

在运行中的容器中执行一段进程

docker exec -i -t container_01 /bin/bash
docker  top container_01

可以通过Ctrl + P和Ctrl + Q的组合键来跳出容器,然后通过attach再次进入容器中。

通过docker top 命令来查看运行中的容器的进程情况。

docker cp
#将本地文件复制到容器中
#docker  cp   lcoalfile   containerID:/dest
docker cp kodexplorer4.40.zip c2bbbc24d4ff:/code

paas平台即服务

数据卷

把代码挂在到容器上,-v 挂载目录到容器

docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest

代码在解压在/opt/xiaoxiao/目录下

容器中nginx服务目录: /usr/share/nginx/html/

[root@oldboy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
4d8056d88a67        nginx:latest        "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:83->80/tcp   nervous_hawking
7145c2acf6d8        nginx:latest        "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes       0.0.0.0:81->80/tcp   unruffled_poincare

如果要更新代码,修改宿主机上的代码就可以,不再容器上修改。

容器数据的持久化

独立于容器生命周期

-v 容器启动,并在宿主机中创建一个持久化卷(/var/lib/docker/volumes/)

#创建一个数据卷
docker create  volume demo

固定卷到宿主机

随机卷名

docker run -d -p 80:80 -v /usr/share/nginx/html nginx:latest

指定数据卷名称

docker create volume  nginx
docker run -d -p 80:80 -v nginx:/usr/share/nginx/html nginx:latest

将宿主机的指定目录或者文件挂载到容器中。

docker run -d -p 80:80 -v /opt/xiaoniao/:/usr/share/nginx/html nginx:latest

跟随一个已经存在的容器的挂载目录 --volumes-from,实现容器之间的数据共享。

docker run -d -p 80:80 --volumes-from [前一个容器ID] nginx:latest
docker volumes ls
[root@oldboy ~]# docker volume ls
DRIVER              VOLUME NAME
local               4050497a519ce30cb72ad1b91a1eb69e9c9570a1df773f7c371bacac8e316d90
local               aeebf6a7fe109a9571f7846494c1b0796f39ea74023be7fc0c9f2bd9257a111e
local               d9c2a9ccefc6a427b91946aabd5d6d001fda015ac376956288633f944497c229
local               d24e50cc007f99a1ca5682c1b973f3c4997b088741cd9539e67f0bef21c32c75
local               nginx_v1
local               nginx_v2
local               nginx_v3

小实验

80访问默认首页,81访问小鸟飞飞。

一下三种方法都是将小鸟菲菲的代码挂栽到容器中。并修改容器中nginx的配置文件。

#1.将代码挂栽到容器的目录中。
docker run -it -p 80-81:80-81 -v /opt/xiaoniao/:opt/xiaonian nginx:latest
#2.通过echo 或者 cat来完成多行配置文件的导入
#3.重启容器
方法1:
docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt/xiaoniao nginx:latest
docker ps -a -l
docker exec -it 06f69f50b04a /bin/bash
cd /etc/nginx/conf.d/
echo '    server {
        listen       81;
        server_name  _;
        root         /opt/xiaoniao;
        index index.html index.htm;
        location / {
        }
    }' >xiaoniao.conf

exit
docker restart 06f69f50b04a

方法2:
docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao:/opt/xiaoniao nginx:latest
vim  xiaoniao.conf
    server {
        listen       81;
        server_name  _;
        root         /opt/xiaoniao;
        index index.html index.htm;
        location / {
        }
    }
docker ps -a -l
docker cp xiaoniao.conf bb915ba7a8ac:/etc/nginx/conf.d/

docker restart bb915ba7a8ac

方法3:
docker run -d -p 84:80 -p 85:81  -v /root/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf  -v /opt/xiaoniao:/opt/xiaoniao nginx:latest
制作docker镜像

启动一个基础容器,在容器中安装服务,然后将安装好服务的容器提交为镜像。

测试生成的镜像是否可用。

手动制作docker镜像步骤:

1:基于镜像,启动基础容器,在容器中安装服务

docker run -it -p 80:80 centos:6.9 /bin/bash
curl -o /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-6.repo
yum install nginx -y
yum install php-fpm php-gd php-mbstring -y

2.修改配置文件

编辑一个一次性启动的脚本/init.sh

vi /init.sh

#!/bin/bash
#/bin/bash
php-fpm -D
nginx -g 'daemon off;'

chmod -x /init.sh

vi /etc/nginx/conf.d/default.conf

server {
              listen 80;
              server_name localhost;
              root    /code;
              location / {
              index index.php  index.html index.htm;
              }
      location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
      }
}

3.上传代码到容器,通过docker cp

mkdir /code
docker cp kodexplorer4.40.zip c2bbbc24d4ff:/code
yum install unzip -y
unzip kodexplorer4.40.zip
chown -R nginx:nginx /code
chmod -R 777 /code/
su -c 'setenforce 0'

测试访问:10.0.0.21

4.提交容器为镜像

docker commit  [容器ID] kod:v1

5.通过提交的镜像完成创建新容器测试kod服务。

[root@oldboy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
kod                 v1                  c008fe8aedd8        About a minute ago   729MB
alpine              latest              a24bb4013296        40 hours ago         5.57MB
nginx               latest              9beeba249f3e        2 weeks ago          127MB
centos              6.9                 adf829198a7f        22 months ago        195MB

docker run -d -p 80:80 kod:v1 sh /init.sh

[root@oldboy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
02b0f2e0dc7d        kod:v1              "sh /init.sh"       34 seconds ago      Up 33 seconds       0.0.0.0:80->80/tcp   nifty_swartz

#保存镜像:
docker save  nginx:latest -o docker_nginx.tar.gz
#导入镜像
docker load -i docker_nginx.tar.gz
自动构建镜像

dockerfile文件编写规则:

FROM  基础镜像,定制的镜像都是基于FROM的镜像,可以是从公有仓库的镜像,也可以是本地的镜像路径
RUN   用于执行后面跟着的命令行命令(安装服务需要执行的命令)
CMD   容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT  容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD   把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY  把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录
EXPOSE  镜像要暴露的端口
VOLUME  持久化卷
ENV     环境变量(ssh的密码,数据库的密码)
LABEL       镜像的属性标签
MAINTAINER  管理者标识
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
dockerfile示例
###dockerfile单服务例子1:

FROM centos:6.9
RUN echo '192.168.19.200  mirrors.aliyun.com' >>/etc/hosts
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]

###dockerfile多服务例子2:

FROM centos6.9_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf 
RUN mkdir /html
WORKDIR /html
RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip 
RUN chown -R nginx:nginx .
ADD init.sh   /init.sh
CMD ["/bin/bash","/init.sh"]

vi /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'

###dockerfile使用环境变量的例子:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh  /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]

vi  init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
    SSH_PWD=$1
fi

echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D

执行构建镜像。

 docker build -t  centos:v3 .

-t 执行自动创建的镜像名称

docker-compose.yml

容器部署zabbix服务

导入镜像
cd zabbix
for n in $(ls *);do docker load -i $n;done
启动容器
docker run --name mysql-server -it \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \   
      --character-set-server=utf8 --collation-server=utf8_bin
     
docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
      
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
      
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

-t 启用一个tty终端。

overlay网络的原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hy8eAIOK-1610093951145)(D:\zhanghaibo\老男孩linux 64期\云计算课程\docker容器\docker基础应用.assets\image-20200607175955254.png)]

consul主要是实现跨容器的网络通信,防止overlay动态分配的IP地址不冲突。

安装部署docker私有仓库

官方默认的 私有仓库registry
#启动私有仓库
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart always --name registry registry:latest

-v /opt/registry #持久化容器卷

–restart always #保持容器一直运行,开机自启动

–name #自定义容器的名称

#1.从docker客户端添加对私有仓库的信任
vim /etc/docker/daemon.json
{
	"registry-mirrors": ["https://registry.docker-cn.com"],
	"insecure-registries": ["40.73.17.117:5000"]
}
systemctl  restart docker

#2.将容器生成镜像,并给镜像设置标签
docker  commit [ImageID] ubuntu:16.04
docker tag docker.io/library/ubuntu:latest 40.73.17.117:5000/ubuntu:zhb

#3.上传镜像到私有仓库中
docker  push  40.73.17.117:5000/ubuntu:zhb

#4.下载镜像到本地
docker pull 40.73.17.117:5000/ubuntu:zhb

“registry-mirrors”: [“https://registry.docker-cn.com”], 镜像加速

“insecure-registries”: [“40.73.17.117:5000”] 添加信任仓库

企业版私有仓库harbor
#下载安装器
https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz

安装harbor,harbor也是使用docker-registry,并且依赖docker-compose。

#解压
tar xf harbor-offline-installer-v1.8.0.tgz
cd  harbor
#编辑harbor.yml文件,修改hostname:域名和登陆密码harbor_admin_password:123456
	hostname: docker.mightytech.cn
	harbor_admin_password: 123456
#安装依赖包(依赖epel源)
yum -y install docker-compose
#安装harbor
./install.sh

提示信息:

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://public.mightytech.cn. 
For more details, please visit https://github.com/goharbor/harbor .

✔ ----已成功安装并启动Harbor----
现在您应该可以访问管理门户http://public.mightytech.cn。
更多详情请访问https://github.com/goharbor/harbor.

默认情况下是通过https协议来上传和下载镜像。跟上面的默认registry一样,可以修改/etc/docker/daemon.json文件

docker login docker.mightytech.cn
docker tag  名称/镜像ID:v1   docker.mightytech.cn/镜像ID:v1
docker push  docker.mightytech.cn/镜像ID:v1
docker pull  docker.mightytech.cn/镜像ID:v1

容器间的互联

不同容器之间如果需要通信,需要知道对方的IP地址,那如何才能知道对方的IP地址呢。从我们常规的主机使用中。指定某一台物理服务的IP地址,后续如果需要与之通信,相对来说很方便。但是在docker容器之间,IP地址是动态分配的。需要知道一个IP地址,需要进入容器查看才会知道。为了解决这个问题呢,docker提供了link工具,通过写入对应的hosts文件来与对方通信。

docker run -it --name mysql01 mysql:latest /bin/bash
docker run -it --link mysql01:mysql01 --name nginx nginx:latest /bin/bash
#这样,nginx容器就能通过mysql名称与之通讯了。当然这只是单向的,只能从nginx容器到mysql容器。所以在使用link是,一般都是先创建后端服务,再前端服务。

这种用法一般在后面的编排工具中经常被用到,比如docker-compose等

docker-compose容器批处理工具

安装docker-compose编排工具,需要用到epel源.

yum -y install docker-compose

用途,在很多容器需要启动和关闭的时候,就可以使用docker-compose来管理这些容器。并且关联启动顺序。在docker-compose中,每个容器都是一个服务。并且实现容器间的双向连接。

相关参数可以参考run命令的使用。

  • 批量启动
  • 批量停止
  • 批量重启:docker-compose restart #批量重启所有docker-compose管理的容器
常用命令:

docker-compose up 批量创建并运行容器

docker-compose down 批量停止并删除容器

docker-compose start 批量启动容器

docker-compose restart 批量重启容器

安装zabbix服务

docker-compose有好几个版本,每个版本的语法不同。这里使用version 3,docker-compose根据yaml文件启动容器。

编辑文件docker-compose.yml文件

version: '3'

services:
        mysql-server:
                image: mysql:5.7
                restart: always
                environment:
                        MYSQL_ROOT_PASSWORD: root_pwd
                        MYSQL_DATABASE: zabbix
                        MYSQL_USER: zabbix
                        MYSQL_PASSWORD: zabbix_pwd
                command: --character-set-server=utf8 --collation-server=utf8_bin
        zabbix-java-gateway:
                image: zabbix/zabbix-java-gateway:latest
                restart: always
        
        zabbix-server:
                depends_on:
                        - mysql-server
                image: zabbix/zabbix-server-mysql:latest
                restart: always
                environment:
                        DB_SERVER_HOST: mysql-server
                        MYSQL_DATABASE: zabbix
                        MYSQL_USER: zabbix
                        MYSQL_PASSWORD: zabbix_pwd
                        MYSQL_ROOT_PASSWORD: root_pwd
                        ZBX_JAVAGATEWAY: zabbix-java-gateway
                ports:
                        - "10051:10051"
                
        zabbix-web-nginx-mysql:
                depends_on:
                        - zabbix-server
                image: zabbix/zabbix-web-nginx-mysql:latest
                ports:
                        - "80:80"
                restart: always
                environment:
                        DB_SERVER_HOST: mysql-server
                        MYSQL_DATABASE: zabbix
                        MYSQL_USER: zabbix
                        MYSQL_PASSWORD: zabbix_pwd
                        MYSQL_ROOT_PASSWORD: root_pwd

执行结果:

[root@oldboy zabbix]#cd  /opt/docker-compose/zabbix/
[root@oldboy zabbix]# vim docker-compose.yml 
Creating zabbix_mysql-server_1           ... done
Creating zabbix_zabbix-java-gateway_1    ... done
Creating zabbix_mysql-server_1           ... 
Creating zabbix_zabbix-server_1          ... done
Creating zabbix_zabbix-server_1          ... 
Creating zabbix_zabbix-web-nginx-mysql_1 ... done
[root@oldboy zabbix]#docker ps

docker-compose.yml文件中指定了启动容器的映射端口,docker默认的网络为bridge,可通过宿主机的IP地址访问zabbix

http://10.0.0.21/index.php

Admin:zabbix

docker-compose.yml编写规则
service部分

compose文件是一个定义服务、网络和卷的YAML文件。

默认的模板文件是docker-compose.yml,其中定义的每个服务都是通过image指定镜像或者build指令(需要dockerfile)来自动构建。其他大部分都跟run命令的参数类似。

如果使用build的指令,在dockerfile中设置的选项(例如:CMD,EXPOSE,VOLUME,ENV等)将自动被获取,无需docker-compose.yml中再次设置。

指定的镜像名称或者镜像ID,如果本地不存在,compose将会尝试去从官方仓库拉取该镜像。

contarner_name: 容器名称

image:启动容器的镜像。

restart :always 总是启动状态。

ports :指定暴露的端口号。

environment: 设置环境环境变量。

depend_on:决定启动的顺序。

build :指定dockerfile所在的文件夹路径。compose将会利用它自动构建这个镜像,然后使用这个镜像

command :覆盖容器启动之后默认执行的命令

links:links属性来做docker容器内访问的网络别名。

deploy:指定启动容器的数目

volumes部分

指令用于设置数据卷挂载路径,数据卷挂在路径可以是一个目录或者一个已经存在的数据卷容器,可以设置宿主机路径(HOST:CONTAINER),或者加上访问模式(HOST:CONTAINER:ro)

volumes:
  # 指定一个容器内的路径,Docker会自动创建一个数据卷。
  - /var/lib/mysql
  # 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
  # 以compose配置文件所在目录为根的相对路径作为数据卷挂载到容器
  - ./cache:/tmp/cache
  # 使用用户的相对路径
  - ~/configs:/etc/configs:ro

服务 services 定义包含应用于为该服务启动的每个容器的配置,类似传递命令行参数一样 docker container create 。同样,网络 networks 和卷 volumes 的定义类似于 docker network create 和 docker volume create

docker网络

docker默认使用bridge模式,可以在启动容器的时候指定使用的网络模式:–network bridge

bridge模式为内网地址:172.17.0.0/16

网络模式:

bridge:内网模式,不是桥接宿主机的网络

host:共用宿主机的网络,共用宿主机的IP地址,共用宿主机的主机名、hosts解析等。(如果宿主机的22好端口被占用,容器就不能再使用22号端口)

container: 可以指定使用某一个容器的网络。共用容器的网络、hosts解析、主机名等。一般用作负载均衡。

none:没有网络

docker run -d -it --network bridge  alpine:latest
docker run -d -it --network host  alpine:latest
docekr run -d -it --network container:ContainerID alpine:latest
自定义网络

docker network

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

docker network create -d bridge --gateway 172.18.0.1 --subnet 172.18.0.0/16  oldboy

-d 指定创建的网络模式,如果不指定,默认bridge

–gateway 指定网关

–subnet 指定子网掩码

oldboy 指定自定义网络的名称

跨宿主的网络macvlan

类似于kvm的桥接模式,让容器有宿主机网段的IP地址。让容器更想一台虚拟机。

需要指定固定的IP地址。也只有macvlan网络能指定固定IP地址。

#1.首先创建一个macvlan网络
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
#2.启动容器,并指定该网络
docker run -it --network macvlan_1 --ip 10.0.0.106 alpine:latest

-o 指定特定的网卡驱动。

不同的宿主机都需要创建。后面会有另外一个跨宿主机的网络overlay,整个群集中只需要创建一个即可。

跨宿主机的网络overlay

容器使用overlay网络,必须指定容器名称,因为owerlay就是使用link主机名来完成的通讯。

可以自动分配IP地址,而且不会冲突,会有数据库存储IP地址。更适合大型的网络架构

使用overlay需要使用consul服务(启动一个容器来运行consul服务),用来独立管理overlay网络。使用端口8500

consul就是一个key/value类型的数据库(可以是用web访问:http://10.0.0.13)

#1.克隆一台虚拟机,启动一个新的容器,安装consul服务。
yum  -y install docker
systemctl enable docker
systemctl start docker
docker run -d -it --name consul -h consul --restart always progrium/consul -server-bootstrap

–name 容器的名称

-h 容器的主机名称

–restart always 保持持续运行

progrium/consul consul的镜像

-server-bootstrap 初始运行命令

#2.在其他节点指定consul服务地址
vim  /etc/docker/daemon.json
{
	"registry-mirrors":["https://registry.docker-cn.com"],
    "cluster-store": "consul://10.0.0.13:8500",
	"cluster-advertise": "10.0.0.11:2376"
}
systemctl  restart docker

“registry-mirrors” docker加速

“cluster-store” consul服务器

“cluster-advertise” 集群节点的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vDuM075j-1610093951150)(D:\zhanghaibo\老男孩linux 64期\云计算课程\docker容器\docker基础应用.assets\image-20200618004405687.png)]

#3.创建overlay网络,只需要在任意一个节点上创建,这个网络是全局的。所有节点都能发现。
docker network create -d overlay --subnet 172.26.0.0/16  --gateway  172.26.0.254  ol1
#4.在节点启动容器,指定到ol1网络测试连通性
docker run -it --network ol1 --name oldboy01 alpine:latest /bin/sh
docker run -it --network ol1 --name oldboy02 alpine:latest /bin/sh

原理:

通过overlay实现跨容器的访问,如果需要外网访问,就需要做端口映射。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJgdJElX-1610093951152)(D:\zhanghaibo\老男孩linux 64期\云计算课程\docker容器\docker基础应用.assets\image-20200618005425301.png)]

每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网

docker-container-shim containerd runC的关系

从docker 1.11之后,docker daemon(docker的守护进程)拆分成了多个模块来适应OCI标准,拆分之后包括:containerd shim runC

containerd:独立负责容器运行时和容器的生命周期(如创建、启动、停止、中止、信号处理、删除等)

shim:容器运行的真实的载体,每启动一个容器就对应一个shim进程,该进程对应三个参数:容器ID、对应容器生成的目录、runC模块

runC: 实现了容器启停、资源隔离等功能 。

containerd-shim 是什么 docker-container-shim是docker容器运行真是的载体,每启动一个容器都会起一个新的docker-skim的进程。shim进程包含容器ID、boundle目录(containerd对应的某个容器生成的目录)、runC

runtime-runC 是什么 runC是docker容器运行的格式标准,比如创建容器都会通过调用runC的api来拼接,runC create 。runC是用来实现容器的启停、资源隔离。

简单说,一个容器运行,containerd container-shim runc是必须的模块。

dockerd 负责上层的封装编排

containerd 负责容器操作,其挂掉或升级,不影响容器的运行,以前是会将所有的容器都挂掉

containerd-shim 调用runc启动容器,监控容器进程状态,回收容器中的相关进程等

docker-shim 适配器,将k8s cri接口与各种容器实现的接口进行适配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FKAl7j2E-1610093951154)(C:/Users/HaiboZhang/AppData/Roaming/Typora/typora-user-images/1606792062765.png)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lebron_zhb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值