作者:京哥 docker技术介绍
1、docker改变了什么?
- 环境 192.168.29.157
- 面向产品:产品交互
- 面向开发:简化环境配置
- 面向测试:多版本测试
- 面向运维:环境一致性
- 面向架构:自动化扩容缩容(微服务)
2、docker的安装
- 安装yum源
由于自带 yum 没有 Docker-CE 所以我们需要先增加 docker repo:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 使用yum安装docker
查看内核版本 Docker 要求 CentOS 系统的内核版本高于 3.10
[root@localhost ~]# uname -r
3.10.0-327.el7.x86_64
升级内核:yum –y update kernel
首先安装 Docker 必要依赖包 :
yum install -y yum-utils device-mapper-persistent-data lvm2
查看仓库中docker版本
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
[root@localhost ~]# yum install -y docker-ce #安装docker
验证:
[root@localhost ~]# echo $?
0
[root@localhost ~]# docker -v
Docker version 19.03.4, build 9013bf583a - 启动docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker.service
[root@localhost ~]# systemctl enable docker #开机启动 - docker公有仓库优化
因为国内访问 Docker Hub 较慢, 可以使用腾讯云提供的国内镜像源, 加速访问 Docker Hub
依次执行以下命令
echo “OPTIONS=’–registry-mirror=https://mirror.ccs.tencentyun.com’” >> /etc/sysconfig/docker
systemctl daemon-reload
systemctl restart docker.service - docker使用国内的镜像仓库
[root@localhost ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],"graph":"/data/docker"
}
下载存放的路径: “graph”:"/data/docker"
-
docker目录信息
docker控制台日志路径:/var/lib/docker/containers #nginx控制台日志也在此
镜像加速:
https://www.daocloud.io/mirror#accelerator-doccurl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
3、docker命令
3.1、查看远程仓库的镜像: docker search centos -s 10 #前10名的
3.2、下载远程仓库的镜像: docker pull centos #centos是远程镜像的名字
3.3、查看本地下载的镜像: docker images
3.4、保存镜像到本地: docker save centos > /opt/centos2019.tar.gz
3.5、删除本地镜像:docker rmi 0f3e07c0138f #0f3e07c0138f是IMAGE ID 多个ID请删除名字:版本
3.6、导入本地镜像包:docker load < /opt/centos2019.tar.gz
3.7、启动一个镜像容器:docker run --name mycentos -t -i centos /bin/bash
3.8、查看镜像运行的容器:docker ps -a
3.9、退出已进入的容器:exit
3.10、重启之前的容器:docker start 07d9dc0f9d90 #07d9dc0f9d90 容器的 id
3.11、进去容器:docker attach 07d9dc0f9d90 #退出后容器也退出 容器是单进程的
3.12、获取容器的pid:docker inspect --format "{
{.State.Pid}}" 07d9dc0f9d90
3.13、进入容器:nsenter -t $pid -u -i -p
3.14、停止一个容器:docker stop 07d9dc0f9d90
3.15、删除一个容器:docker rm 07d9dc0f9d90
3.16、说明:删除一个运行的容器需要加-f
4、docker网络和存储
- docker网络
说明:docker默认使用端口映射来让容器的某一个端口映射对外,一种是随机映射、一种是指定映射
4.1、ip a #查询有一个nat模式的docker 0网卡
4.2、随机映射:docker run -d -P --name mytestnginx nginx
4.3、查看docker运行进程的日志:docker logs 7d1c49bb9d3d # 7d1c49bb9d3d是容器的id
4.4、指定端口映射:docker run -d -p 88:80 --name mynginx88 nginx - docker存储
说明:Docker提供三种不同的方式将数据从宿主机挂载到容器中:
volumes,bind mounts和tmpfs
volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
bind mounts:可以存储在宿主机系统的任意位置 (相当于做个软连接)
tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统(很少用)
管理卷:
[root@VM_192_8_centos ~]# docker volume ls #查询已创建的volume
[root@VM_192_8_centos ~]# docker volume create nginx-vol #创建nginx使用的存储卷
[root@VM_192_8_centos ~]# docker volume inspect nginx-vol #查询创建的卷的信息
用卷创建一个容器:
[root@VM_192_8_centos ~]# docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
[root@VM_192_8_centos ~]# docker run -d -it -p 88:80 --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
进入容器:
[root@VM_192_8_centos _data]# docker exec -it nginx-test bash
root@dbc79dc3099a:/# cd /usr/share/nginx/html/
root@dbc79dc3099a:/usr/share/nginx/html# ls
50x.html index.html xiajing.html
root@dbc79dc3099a:/usr/share/nginx/html# vi xiajing.html
bash: vi: command not found
root@dbc79dc3099a:/usr/share/nginx/html# echo "2019" > xiajing.html
docker的存储默认有两种方式1、数据卷2、数据卷容器
4.5、数据卷:docker run -it -v /opt/test:/opt --name mycentos centos
4.6、数据卷容器:
- 创建数据卷: docker run -d --name mytestcentos -v /data centos
- 查看容器信息:docker inspect 63e22e4c2b1a #找到monts挂载的物理路径
- 创建数据卷容器:docker run -it --name mytest1 --volumes-from mytestcentos centos
5、 手工创建镜像
5.1、容器安装nginx
说明:https://mirrors.aliyun.com/epel/ 下载rpm源
[root@localhost ~]# docker run --name mynginx -it centos
[root@9bbcb0090fb2 /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
Retrieving https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
warning: /var/tmp/rpm-tmp.KarnVr: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:epel-release-7-12 ################################# [100%]
[root@9bbcb0090fb2 /]# yum install -y nginx
5.2、创建自己的镜像:
[root@localhost ~]# docker commit -m "my frist docker" 9bbcb0090fb2 xiajing/mynginx:v1
sha256:76bfcefe561365d043e0e2caa7465a74a56725e96e03d4dd510791caa56ae36f
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 540a289bab6c Less than a second ago 126MB
centos latest 0f3e07c0138f Less than a second ago 220MB
xiajing/mynginx v1 76bfcefe5613 9 seconds ago 331MB
[root@localhost ~]#
启动创建的镜像:docker run -it --name mycentos-nginx xiajing/mynginx:v1
修改容器nginx前台运行:[root@ca5a843f5fc8 /]# vi /etc/nginx/nginx.conf
daemon off;
5.3、再次创建前台运行nginx镜像:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca5a843f5fc8 xiajing/mynginx:v1 "/bin/bash" 4 minutes ago Exited (130) 11 seconds ago mycentos-nginx
9bbcb0090fb2 centos "/bin/bash" 27 minutes ago Exited (130) 15 minutes ago mynginx
c11596e6d6d9 centos "/bin/bash" 39 minutes ago Exited (127) 29 minutes ago mydata
fac7cbcdcdb1 centos "/bin/bash" 45 minutes ago Exited (0) 42 minutes ago mytestcentos1
63e22e4c2b1a centos "/bin/bash" 53 minutes ago Exited (0) 53 minutes ago mytestcentos
ba951ffe5a8d centos "/bin/bash" About an hour ago Exited (0) About an hour ago mycentos
6eaf16f7b61f nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:88->80/tcp mynginx88
[root@localhost ~]# docker commit -m "my 2 docker" ca5a843f5fc8 xiajing/mynginx:v2
sha256:93eb1231cfcd0601ce78abb2b8529370b41a3cebf30fca4df027dfb19f1651d9
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 540a289bab6c Less than a second ago 126MB
centos latest 0f3e07c0138f Less than a second ago 220MB
xiajing/mynginx v2 93eb1231cfcd 50 seconds ago 331MB
xiajing/mynginx v1 76bfcefe5613 11 minutes ago 331MB
[root@localhost ~]#
5.4、启动自己安装的容器:
docker run -d -p 85:80 --name mycentos-nginx2 xiajing/mynginx:v2 nginx # nginx 是命令启动nginx
docker run -d -v /opt/test:/usr/share/nginx/html -p 89:80 --name mycentos-nginx3 xiajing/mynginx:v2 nginx
6、Dockerfile构建镜像
Dockerfile构建步骤:1、基础镜像信息 2、维护者信息 3、镜像操作指令 4、容器启动执行的命令
Dockerfile构建命令:
7、docker运输
参考:https://blog.csdn.net/egworkspace/article/details/80518647
-
在腾讯云申请免费的证书
使用自己申请的域名m5c.top申请一个docker.m5c.top的腾讯云ssl证书,不然需要自己使用OpenSSL自己生成,这也是很多博文所提到的做法,不保证成功; -
安装配置一个nginx
安装配置一个nginx,使用代理可以使用用户认证;(nginx可选)
nginx的http配置:upstream docker { zone myapp1 64k; server 127.0.0.1:5000 weight=1 max_fails=3 fail_timeout=30s; } server { listen 443; server_name docker.m5c.top; ssl on; ssl_certificate /usr/local/ssl_nginx/1_docker.m5c.top_bundle.crt; ssl_certificate_key /usr/local/ssl_nginx/2_docker.m5c.top.key; client_max_body_size 0; chunked_transfer_encoding on; location / { auth_basic Docker"; auth_basic_user_file /usr/local/nginx/conf/dockerpasswd; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass https://docker; } }
认证命令信息:htpasswd -c /usr/local/nginx/conf/dockerpasswd Docker #输入密码
我们的用户是Docker 密码是 xiajing3673 -
docker下载一个Docker Registry
命令:docker pull registry:2
注意:笔者在pull的时候,指定了TAG,即为使用v2版本的registry,对于v1版本的registry,读者大可不必在意了,基本上是淘汰了;
运行命令:docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry --restart=always --name registry registry:2
验证,读者可以拉取一个busybox镜像(因为体积小),进行实验:
docker pull busybox
拉取最新的busybox镜像后,再给其打标签,准备发布到Registry中:
docker tag busybox localhost:5000/bosybox:v1.0
最后再推送给Registry;
docker push localhost:5000/bosybox:v1.0
此时,Registry就有了busybox:v1.0镜像了,这时可以不用再去Docker Hub上面拉取了,通过自建的Registry即可
docker pull localhost:5000/bosybox:v1.0
如果想查看远程仓库有哪些镜像,可以运行如下命令: curl http://localhost:5000/v2/_catalog
说明:到此为止,我们已经搭建了一个Docker Registry的“半成品”,说是“半成品”是因为这个Registry只能在本机正常工作,如果在其他主机上试图推送镜像上来,结果是失败的。 -
基于SSL证书改造Registry
我的域名docker.m5c.top的ssl腾讯证书已配置到nginx
在nginx.conf配置文件中,需要注意因为对Registry的访问都是通过REST API完成的,而且是HTTPS的访问协议,所以location节点的配置中,proxy_pass配置的是https://registry,如果配置成http://registry,一旦Docker Registry启用了SSL后,是访问不通的。
重新启用一个容器:
docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry -v /usr/local/ssl_nginx:/ssl_nginx -e REGISTRY_HTTP_TLS_CERTIFICATE=/ssl_nginx/1_docker.m5c.top_bundle.crt -e REGISTRY_HTTP_TLS_KEY=/ssl_nginx/2_docker.m5c.top.key --restart=always --name registry registry:2
如果没有安装nginx的读者,可运行这条命令:
```
docker run -d \
-p 443:443 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
–restart=always \
–name registry \
registry:2
可以浏览器访问:https://docker.m5c.top/v2/_catalog
接下来,我们实验一下在另外一台主机,重复上述步骤,依然可以成功;
* **异常处理**
服务器时间不一致异常
[root@localhost ~]# docker login docker.m5c.top
Username: Docker
Password:
Error response from daemon: Get https://docker.m5c.top/v2/: x509: certificate has expired or is not yet valid
此异常时服务器时间不同步导致的;使用 ntpdate cn.pool.ntp.org 同步时间
* **其它服务器测试**
[root@localhost ~]# docker login https://docker.m5c.top
[root@localhost ~]# docker tag xiajing/mynginx:v2 docker.m5c.top/mynginx:v1.0
[root@localhost ~]# docker push docker.m5c.top/mynginx:v1.0
The push refers to repository [docker.m5c.top/mynginx]
7ed5b7f8d9f7: Layer already exists
1acb874f057c: Layer already exists
9e607bb861a7: Layer already exists
v1.0: digest: sha256:64bae4b0ef2a7d75b91d613bf8a06c36a8dc9716117676ad559d7f788992b499 size: 949
[root@localhost ~]#
[root@localhost ~]# docker pull docker.m5c.top/mynginx:v1.0
v1.0: Pulling from mynginx
Digest: sha256:64bae4b0ef2a7d75b91d613bf8a06c36a8dc9716117676ad559d7f788992b499
Status: Downloaded newer image for docker.m5c.top/ mynginx:v1.0
docker.m5c.top/mynginx:v1.0
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 540a289bab6c 6 days ago 126MB
centos latest 0f3e07c0138f 3 weeks ago 220MB
docker.m5c.top/zhrtcentos latest 0f3e07c0138f 3 weeks ago 220MB
xiajing/mynginx v2 93eb1231cfcd 6 weeks ago 331MB
docker.m5c.top/mynginx v1.0 93eb1231cfcd 6 weeks ago 331MB
xiajing/mynginx v1 76bfcefe5613 6 weeks ago 331MB
[root@localhost ~]#