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容器的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139
vscode 远程连接 docker 容器进行 C++ 代码调试实践