Docker容器

Posted opesn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器相关的知识,希望对你有一定的参考价值。

Docker容器

容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件、ip地址、主机名等

容器和虚拟化的区别

kvm虚拟化:需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级

开机启动流程:
bios开机硬件自检
根据bios设置的优先启动boot
读取grub引导
加载内核
启动第一个进程/sbin/init
系统初始化完成
运行服务

容器虚拟化:不需要硬件的支持。不需要模拟硬件,共用宿主机的内核,启动时间秒级(没有开机启动流程)

容器启动流程:
共用宿主机内核:
第一个进程,服务nginx、httpd、mysql
容器:共用宿主机内核,容器的第一个进程直接运行服务,轻量级,损耗少,启动快,性能高

总结:

与宿主机使用同一个内核,性能损耗小
不需要指令级模拟
容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制
避免了准虚拟化和系统调用替换中的复杂性
轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

容器技术的发展过程

#chroot技术:
拥有自己完整的系统文件

#lxc:
(namespaces(命名空间):隔离环境、cgroups:进程资源限制)

#docker:
docker是通过进行虚拟化技术
(namespaces及cgroups、cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行是,不需要类似虚拟机(VM)格外的操作系统开销,提高资源利用率。

docker是一种软件的打包技术
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的系统文件rootfs。

kvm解决了硬件和操作系统之间的依赖
kvm独立的虚拟磁盘,xml配置文件

docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果
docker镜像有自己的文件系统

docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或共有云主机上运行。

docker安装

[root@docker01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i ‘s#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g‘ /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum -y install docker-ce
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        a872fc2f86
 Built:             Tue Oct  8 00:58:10 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       a872fc2f86
  Built:            Tue Oct  8 00:56:46 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
[root@docker01 ~]# 

#docker info 查看docker信息
[root@docker01 ~]# docker info
Server:
 Containers: 0   #容器数量
  Running: 0     #正在运行的容器
  Paused: 0      #暂停状态的容器
  Stopped: 0     #已经死掉的容器
 Images: 0       #下载了多少镜像
 Server Version: 19.03.3   #docker版本
   Backing Filesystem: xfs   #文件系统
    Logging Driver: json-file   #日志格式
 Registry: https://index.docker.io/v1/   #镜像下载地址

#docker system df 查看docker占用多少空间
[root@docker01 ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              0                   0                   0B                  0B
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
[root@docker01 ~]# 

docker主要组件

镜像、容器、仓库、网络、存储

启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库

启动第一个容器

#配置一个镜像加速器
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://68rmyzg7.mirror.aliyuncs.com"]
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker run -d -p 80:80 nginx
run     #创建并运行一个容器
-d      #放在后台
-p      #端口映射
nginx   #docker镜像的名字

技术图片

docker的镜像管理

#搜索官方仓库镜像
[root@docker01 ~]# docker search centos
NAME                        DESCRIPTION                      STARS      OFFICIAL   AUTOMATED
centos                      The official build of CentOS.    5485       [OK]             
ansible/centos7-ansible     Ansible on Centos7               122                   [OK]
NAME:镜像名称
DESCRIPTION:镜像说明
STARS:点赞数量
OFFICIAL:是否是官方的
AUTOMATED:是否是自动构建的
选镜像的建议:
1.优先考虑官方的
2.stars数量多的

#获取镜像
[root@docker01 ~]# docker pull centos
镜像加速器:阿里云加速器、daocloud加速器、中科大加速器、
			Docker中国官方加速器(https://registry.docker-cn.com)
官方pull         #docker pull centos(没有指定版本,默认会下载最新版) 
私有仓库pull     #ansible/centos7-ansible
#获取指定镜像版本
[root@docker01 ~]# docker pull centos:6.9

#查看镜像列表
[root@docker01 ~]# docker image ls
[root@docker01 ~]# docker images
#标识镜像唯一性的方法:
1.REPOSITORY:TAG
2.IMAGE ID(sha256:64位的号码,默认只截取12位)

#查看更详细详细加--no-trunc
[root@docker01 ~]# docker image ls --no-trunc 

#镜像的导出
[root@docker01 ~]# docker image save centos:latest -o docker_centos.tar.gz

#镜像删除
[root@docker01 ~]# docker image rm centos:latest 

#镜像导入
[root@docker01 ~]# docker image load -i docker_centos.tar.gz 

#查看镜像的属性
[root@docker01 ~]# docker image inspect nginx:latest

#删除没有被占用的镜像
[root@docker01 ~]# docker image prune

#标签的设置
[root@docker01 ~]# docker image tag e445ab08b2be ngx:v1

#只查看镜像ID
[root@docker01 ~]# docker image ls -q

#查看最新生成的镜像ID
[root@docker01 ~]# docker container ls -a -q -l

#删除所有镜像
[root@docker01 ~]# docker image rm -f `docker image ls -q`

#在正在运行的镜像中克隆一个新的镜像
[root@docker01 ~]# docker container commit pedantic_chebyshev hello-world:v1

docker的容器管理

#交互式的容器
[root@docker01 ~]# docker run -it --name centos6.9 centos:6.9 /bin/bash
-it        #分配交互式的终端
--name     #指定容器的名字
/bin/bash  #覆盖容器的初始命令

#守护式容器
[root@docker01 ~]# docker run -d -p 80:80 nginx:latest
run     #创建并运行一个容器
-d      #放在后台
-p      #端口映射
nginx   #docker镜像的名字

#停止容器
[root@docker01 ~]# docker container stop centos6.9 

#容器的启动
[root@docker01 ~]# docker container start trusting_carson

#容器重启
[root@docker01 ~]# docker container restart nostalgic_hofstadter

#杀死容器
[root@docker01 ~]# docker container kill centos6.9 

#查看容器列表
[root@docker01 ~]# docker ps
#查看容器列表(包括停止的)
[root@docker01 ~]# docker ps -a
#查看最新的容器列表
[root@docker01 ~]# docker ps -a -l

#删除容器
[root@docker01 ~]# docker container rm nice_knuth

#容器的连接方法
#attach方式(会让所有用户通过此方法进入容器的用户看到同样的操作,一个用户退出全部一起退出,类似镜像链接)
[root@docker01 ~]# docker container attach peaceful_hellman 

#exec方式(子进程方式登录,在已有的容器中生成子进程,做登录,可以进行容器的调试,退出时也不会影响当前容器)
[root@docker01 ~]# docker container exec -it peaceful_hellman /bin/bash

#容器的后台运行
ctrl + p 加 ctrl + q

#将后台容器调到前台
[root@docker01 ~]# docker container attach  epic_meitner

#总结
docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态
业务在容器中运行:夯主,启动服务

docker的端口映射

指定映射(docker会自动添加一条iptables规则来实现端口映射)

参数 说明
-p hostPort:containerPort 端口映射 -p 8080:80
-p ip:hostPort:containerPort 配置监听地址 -p 10.0.1.205:8080:80
-p ip::containerPort 随机端口映射 -p 10.0.1.205::80
-p hostPort:containerPort/udp 指定协议 -p 8080:80/udp
-p 81:80 -p 443:443 指定多个端口映射
#端口映射
[root@docker01 ~]# docker run -d -p 80:80 nginx:latest

#配置监听地址
[root@docker01 ~]# docker run -d -p 10.0.1.205:8080:80 nginx:latest

#随机端口映射
[root@docker01 ~]# docker run -d -p 10.0.1.205::80 nginx:latest
[root@docker01 ~]# docker run -d -P nginx:latest

#指定协议
[root@docker01 ~]# docker run -d -p 81:80/udp nginx:latest

#指定多个端口映射
[root@docker01 ~]# docker run -d -p 82:80 -p 443:443 nginx:latest

docker的数据卷管理

[root@docker01 ~]# docker run -d -p 80:80 -v /opt/html/:/usr/share/nginx/html --name=nginx01 nginx:latest 
[root@docker01 ~]# echo "test test tes" >/opt/html/index.html
持久化
数据卷(文件或目录)
-v   #卷名:/data
-v   #src(宿主机的目录):dst(容器的目录)

数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
[root@docker01 ~]# docker run -d -p 81:80 --volumes-from nginx01 nginx:latest


技术图片

#创建数据卷持久化
[root@docker01 ~]# docker run -d -p 80:80 -v data:/usr/share/nginx/html  -v opesn:/etc/nginx/conf.d/ nginx:latest 
b9a8fa7865b954dc8d3dbf541ecfd165981ab77e52dcc2b73ef9efbcce80ec93
[root@docker01 ~]# docker volume ls
DRIVER              VOLUME NAME
local               data
local               opesn
[root@docker01 ~]# 
[root@docker01 ~]# docker volume inspect opesn 
[
    {
        "CreatedAt": "2019-10-14T01:05:56+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/opesn/_data",
        "Name": "opesn",
        "Options": null,
        "Scope": "local"
    }
]
[root@docker01 ~]# 
[root@docker01 ~]# ll /var/lib/docker/volumes/opesn/_data/
total 4
-rw-r--r-- 1 root root 1093 Sep 24 22:49 default.conf
[root@docker01 ~]# 

#总结
数据卷是空的时候,会把容器的目录拉过来
数据卷有数据时,会把数据覆盖到容器的目录

docker手动镜像制作

#手动将容器保存未镜像
docker commit 容器id或容器的名字 新的镜像名字[:版本号可选]

#基于容器制作镜像
[root@docker01 ~]# docker run -it -p 2222:22 centos:6.9
[root@4229496a3d3d /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@4229496a3d3d /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@4229496a3d3d /]# yum -y install openssh-server
[root@4229496a3d3d /]# service sshd start
[root@4229496a3d3d /]# echo ‘123456‘|passwd --stdin root 
[root@docker01 ~]# docker container commit 4229496a3d3d centos6.9_ssh:v1
[root@docker01 ~]# docker run -d -p 2223:22 centos6.9_ssh:v1 /usr/sbin/sshd -D

#构建LNMP镜像
[root@docker01 ~]# docker run -d -p 2222:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
[root@docker01 ~]# docker exec -it youthful_goodall /bin/bash
[root@124e14ac918e /]# yum -y install nginx php-fpm mysql-server php-mysql
[root@124e14ac918e /]# vi /etc/nginx/conf.d/default.conf
[root@124e14ac918e /]# cat /etc/nginx/conf.d/default.conf
server {
  listen  80;
  server_name localhost;
  location / {
    root /usr/share/nginx/html/;
    index index.php;
  }
  location ~ .php$ {
    root /usr/share/nginx/html;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
    include fastcgi_params;
  }
}
[root@124e14ac918e /]#
[root@124e14ac918e /]# echo ‘<?php phpinfo(); ?>‘ > /usr/share/nginx/html/index.php
[root@124e14ac918e /]# service nginx start
[root@124e14ac918e /]# service php-fpm start
[root@124e14ac918e /]# service mysqld start
[root@124e14ac918e /]# vi init.sh
[root@124e14ac918e /]# cat init.sh
#/bin/bash
service nginx start
service php-fpm start
service mysqld start
/usr/sbin/sshd -D
[root@124e14ac918e /]# 
[root@docker01 ~]# docker commit 124e14ac918e lnmp:v1
[root@docker01 ~]# docker container run -d -p 2223:22 -p 80:80 lnmp:v1 /bin/bash /init.sh

技术图片

#制作centos7镜像
[root@docker01 ~]# docker run --privileged -d -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup centos:7.6.1810 /usr/sbin/init
[root@docker01 ~]# docker exec -it strange_feynman /bin/bash
[root@7dab784d700e /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@7dab784d700e /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@7dab784d700e /]# yum -y install openssh-server
[root@7dab784d700e /]# systemctl start sshd
[root@7dab784d700e /]# systemctl enable sshd
[root@7dab784d700e /]# echo ‘systemctl start sshd‘ >>/etc/rc.local
[root@7dab784d700e /]# echo ‘123456‘ | passwd --stdin root
[root@docker01 ~]# docker container commit 7dab784d700e centos7.6_ssh:v1

[root@docker01 ~]# docker run --privileged -d -p 2222:22 centos7.6_ssh:v1 /usr/sbin/init
[root@docker01 ~]# ssh root@10.0.1.205 -p2222
The authenticity of host ‘[10.0.1.205]:2222 ([10.0.1.205]:2222)‘ can‘t be established.
ECDSA key fingerprint is SHA256:Zljrg76zsV2etJxxFdJJv6VB+wKmQlPzvsVG73mmzXc.
ECDSA key fingerprint is MD5:37:cd:ee:0f:73:f6:51:8a:4f:c4:fc:02:7a:15:4d:4e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘[10.0.1.205]:2222‘ (ECDSA) to the list of known hosts.
root@10.0.1.205‘s password: 
[root@0b318e3435d3 ~]# 

dockerfile自动构建镜像

类似ansible剧本,大小几kb
手动做镜像:大小几百M+
dockerfile支持自定义容器的初始命令

#dockerfile主要组成部分:
基础镜像信息          FROM centos:6.9
制作镜像操作指令      RUM yum install openssh-server -y
容器启动时执行指令    CMD ["/bin/bash"]
#dockerfile常用指令:
FROM          这个镜像的妈妈是谁(指定基础镜像)
MAINTAINER    告诉别人,谁复制养它?(指定维护者信息,可以没有)
LABLE         描述,标签
RUN           你想让它干啥(在命令前面加上RUN即可)
ADD           给它点创业资金(会自动解压tar),制作docker基础的系统镜像
workdir       设置当前工作目录
volume        设置卷,挂载主机目录
EXPOSE        指定对外的端口(-P 随机端口)
CMD           指定容器启动后的要干的事情(容易被替换)
#dockerfile其他指令:
COPY          复制文件(不会解压)
ENV           环境变量
ENTRYPOINT    容器启动后执行的命令(无法被替换,启动容器的时候指定的命令,会被当成参数)


#制作dockerfile
[root@docker01 ~]# mkdir -p /opt/dockerfile/centos6.9_ssh
[root@docker01 ~]# cd /opt/dockerfile/centos6.9_ssh/
[root@docker01 centos6.9_ssh]# vim dockerfile
FROM centos:6.9
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 -y install openssh-server
RUN service sshd start
RUN echo ‘123456‘|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
[root@docker01 centos6.9_ssh]# docker build -t centos6.9_ssh:v2 .
[root@docker01 centos6.9_ssh]# docker run -d -p 3333:22 centos6.9_ssh:v2
cb94f76012524bd38dd964033ba3dd87762017873a7e875892ab24b3ecc58db9
[root@docker01 centos6.9_ssh]# ssh root@10.0.1.205 -p3333
The authenticity of host ‘[10.0.1.205]:3333 ([10.0.1.205]:3333)‘ can‘t be established.
RSA key fingerprint is SHA256:QhdctR4oY2aX2/uHh2CxogWgwGykB82+HsiqAZZAA/E.
RSA key fingerprint is MD5:2d:7f:f1:ce:67:2a:ae:2f:24:5c:20:a7:9a:a4:2c:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘[10.0.1.205]:3333‘ (RSA) to the list of known hosts.
root@10.0.1.205‘s password: 
[root@cb94f7601252 ~]# 


#制作ssh和nginx双服务dockerfile
[root@docker01 dockerfile]# cp -a centos6.9_ssh centos6.9_ssh_nginx
[root@docker01 dockerfile]# cd centos6.9_ssh_nginx/
[root@docker01 centos6.9_ssh_nginx]# vim dockerfile 
FROM centos:6.9
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 -y install openssh-server nginx
RUN service sshd start
RUN echo ‘123456‘|passwd --stdin root
ADD init.sh /init.sh
ENV $SSH_PWD 123456
CMD ["/bin/bash","/init.sh"]
[root@docker01 centos6.9_ssh_nginx]# vim init.sh
#!/bin/bash
echo $SSH_PWD |passwd --stdin root
service nginx start
/usr/sbin/sshd -D
[root@docker01 centos6.9_ssh_nginx]# docker build -t centos6.9_ssh_nginx:v1 .
[root@docker01 centos6.9_ssh_nginx]# docker run -d -p 80:80 -p 1111:22 centos6.9_ssh_nginx:v1 
[root@docker01 centos6.9_ssh_nginx]# curl -I 10.0.1.205
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 14 Oct 2019 14:42:05 GMT
Content-Type: text/html
Content-Length: 3698
Last-Modified: Tue, 07 May 2019 06:09:40 GMT
Connection: keep-alive
ETag: "5cd12124-e72"
Accept-Ranges: bytes

[root@docker01 centos6.9_ssh_nginx]# 

docker镜像的分层

镜像分层的好处:复用,节省磁盘空间,相同的内容自需加载一份到内存.修改dockerfile之后,再次构建速度快

技术图片

容器间的互联

[root@docker02 ~]# docker run -d centos6.9_ssh:v2
[root@docker02 ~]# docker run -it --link clever_euler:ssh01 centos6.9_ssh:v2 /bin/bash
[root@4817d777f10c /]# hostname -I
172.17.0.3 
[root@4817d777f10c /]# ping ssh01
PING ssh01 (172.17.0.2) 56(84) bytes of data.
64 bytes from ssh01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from ssh01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- ssh01 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1312ms
rtt min/avg/max/mdev = 0.057/0.067/0.078/0.013 ms
[root@4817d777f10c /]# 

#docker运行zabbix-server
1、启动一个mysql的容器
docker run --name mysql-server -t       -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

2、启动java-gateway容器监控java服务
docker run --name zabbix-java-gateway -t       -d zabbix/zabbix-java-gateway:latest

3、启动zabbix-mysql容器使用link连接mysql与java-gateway。
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

4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。
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

docker registry(私有仓库)

#普通的registry
[root@docker01 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
[root@docker01 ~]# vim /etc/docker/daemon.json 
{
"registry-mirrors":["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries":["10.0.1.205:5000"]
}
[root@docker01 ~]# systemctl restart docker

#给镜像打标签
[root@docker01 ~]# docker image tag lnmp:v1 10.0.1.205:5000/lnmp:v1

#上传镜像
[root@docker01 ~]# docker push 10.0.1.205:5000/lnmp

[root@docker01 ~]# curl http://10.0.1.205:5000/v2/_catalog
{"repositories":["lnmp"]}
[root@docker01 ~]# 
[root@docker01 ~]# curl http://10.0.1.205:5000/v2/lnmp/tags/list
{"name":"lnmp","tags":["v1"]}
[root@docker01 ~]# 

#docker02操作(10.0.1.206)
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["10.0.1.205:5000"]
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker pull 10.0.1.205:5000/lnmp:v1



#带认证的私有仓库
[root@docker01 ~]# yum -y install httpd-tools
[root@docker01 ~]# mkdir -p /opt/registry-var/auth/
[root@docker01 ~]# htpasswd -Bbn opesn 123456 >> /opt/registry-var/auth/htpasswd
[root@docker01 ~]# cat /opt/registry-var/auth/htpasswd
opesn:$2y$05$2H.ZCqe.NMiUxkqqdlcsaugRB89ZMJjQSzQP8sNmaAE63yYWheXRi
[root@docker01 ~]# docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry

#docker02操作(10.0.1.206)
#上传镜像
[root@docker02 ~]# docker image load -i docker_nginx1.13.tar.gz
[root@docker02 ~]# docker login 10.0.1.205:5000
Username: opesn
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
[root@docker02 ~]# docker push 10.0.1.205:5000/nginx:1.13 

#退出登录
[root@docker02 ~]# docker logout 10.0.1.205:5000

解决重启docker,容器停止问题

#方法一
docker run --resstart=always
#方法二
[root@docker01 ~]# vim /etc/docker/daemon.json 
{
"registry-mirrors":["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries":["10.0.1.205:5000"],
"live-restore":true
}

docker网络类型

#None : 不为容器配置任何网络功能
[root@docker02 ~]# docker run -it --network none 10.0.1.205:5000/lnmp:v1 /bin/bash

#Container : 与另一个运行中的容器共享Network Namespace
[root@docker01 ~]# docker run -it --network container:5071e43667cb centos6.9_ssh_nginx:v1 /bin/bash

#Host : 与宿主机共享Network Namespace
[root@docker01 ~]# docker run -it --network host centos6.9_ssh:v2 /bin/bash

#Bridge : Docker设计的NAT网络模型(默认类型)

跨主机容器之间的通信macvlan

默认一个物理网卡,只能一个物理地址,虚拟多个mac地址

#创建macvlan网络
#docker01
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.0.1.0/24 --gateway 10.0.1.254 -o parent=eth0 macvlan_1

#docker02
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.1.0/24 --gateway 10.0.1.254 -o parent=eth0 macvlan_1

#创建使用macvlan网络的容器
#docker01
[root@docker01 ~]# docker run -it --network macvlan_1 --ip=10.0.1.155 centos6.9_ssh:v2 /bin/bash
[root@ffb369ba0a4b /]# 

#docker02
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.0.1.156 centos6.9_ssh:v2 /bin/bash
[root@e840b8412dbc /]# ping -c1 10.0.1.155
PING 10.0.1.155 (10.0.1.155) 56(84) bytes of data.
64 bytes from 10.0.1.155: icmp_seq=1 ttl=64 time=0.402 ms
[root@e840b8412dbc /]# 

跨主机容器之间的通信overlay

consul: kv类型的存储数据库(key:value)

#docker01、02配置
[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors":["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries":["10.0.1.205:5000"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.1.205:8500",
"cluster-advertise": "10.0.1.205:2376"
}

[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
[root@docker01 ~]# systemctl daemon-reload 
[root@docker01 ~]# systemctl restart docker

#docker01
[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul --server -bootstrap
-h #设置容器的主机名

#创建overlay网络
[root@docker01 ~]# docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 oll
[root@docker01 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c64de965e632        bridge              bridge              local
c221fbac8796        host                host                local
39d797a08a08        macvlan_1           macvlan             local
a6f1a1288fd3        none                null                local
2e07c95d20c9        oll                 overlay             global
[root@docker01 ~]# 

#启动容器测试
#docker01
[root@docker01 ~]# docker run -it --network oll --name opesn01 -h opesn01 centos6.9_ssh:v2 /bin/bash
[root@opesn01 /]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
141: eth0@if142: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:ac:10:00:01 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.1/24 brd 172.16.0.255 scope global eth0
       valid_lft forever preferred_lft forever
144: eth1@if145: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
[root@opesn01 /]# 

#docker02
[root@docker02 ~]# docker run -it --network oll --name opesn02  centos6.9_ssh:v2 /bin/bash
[root@3e00c103547c /]# ping -c1 opesn01
PING opesn01 (172.16.0.1) 56(84) bytes of data.
64 bytes from opesn01.oll (172.16.0.1): icmp_seq=1 ttl=64 time=0.448 ms
[root@3e00c103547c /]# 

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

docker-compose编排工具

#安装docker-compose
[root@docker01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker01 ~]# yum -y install python2-pip
[root@docker01 ~]# pip install docker-compose -i https://mirrors.aliyun.com/pypi/simple/

编写docker-compose

[root@docker01 ~]# mkdir -p /opt/my_wordpress
[root@docker01 ~]# cd /opt/my_wordpress/
[root@docker01 my_wordpress]# cat docker-compose.yml
version: ‘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
     volumes:
       - web_data:/var/www/html
     ports: 
       - "80:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    web_data:
[root@docker01 my_wordpress]# docker-compose up
#启动方法:docker-compose up
#后台启动方法:docker-compose up -d

docker企业级镜像仓库harbor

[root@docker01 ~]# mkdir /opt/harbor
[root@docker01 ~]# cd /opt/harbor
[root@docker01 harbor]# 

#下载harbor
[root@docker01 harbor]# wget https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.1.tgz
[root@docker01 harbor]# tar xf harbor-offline-installer-v1.5.1.tgz 
[root@docker01 harbor]# cd harbor/

#修改主机及web界面密码
[root@docker01 harbor]# vim harbor.cfg 
hostname = 10.0.1.205
harbor_admin_password = 123456

#安装
[root@docker01 harbor]# ./install.sh 
浏览器访问:10.0.1.205
用户:admin	密码:123456

技术图片

新建项目

技术图片

#上传镜像
[root@docker02 ~]# vim /etc/docker/daemon.json 
{
"insecure-registries":["10.0.1.205:5000","10.0.1.205"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.1.205:8500",
"cluster-advertise": "10.0.1.206:2376"
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker tag nginx:1.13 10.0.1.205/opesn/nginx:1.13
[root@docker02 ~]# docker login 10.0.1.205
Username: admin
Password: 
Login Succeeded

#推送镜像
[root@docker02 ~]# docker push 10.0.1.205/opesn/nginx:1.13 

技术图片

#下载镜像
[root@docker01 ~]# vim /etc/docker/daemon.json 
{
"registry-mirrors":["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries":["10.0.1.205:5000","10.0.1.205"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.1.205:8500",
"cluster-advertise": "10.0.1.205:2376"
}
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker pull 10.0.1.205/opesn/nginx:1.13

以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章

linux_docker入门

无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139

vscode 远程连接 docker 容器进行 C++ 代码调试实践

使用 Spring Boot 代码运行 docker 容器

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码

如何使用 VS Code 在 Docker 容器中远程调试 python 代码