docker 容器

docker 简介

   首先呢,docker是个容器,就是将你的应用跑在物理机之上,给你扩容出来的一些资源。那么他与kvm有什么不同呢?其实就是在于分配资源的形式不同,kvm是基于硬件资源的分配实际上是物理机上运行虚拟机再开应用的一个过程,而docker是基于kernel内存级别的资源隔离。

   docker的过程简单概括为,构建--运输--运行,是c/s架构,它的组件是镜像,容器,仓库

安装Docker与加速器配置

Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10。 CentOS 7满足最低内核的要求,如果你之前安装过docekr,或者安装了老版本的docker,建议先卸载掉。旧版本的 Docker称为docker或者 docker-engine,使用以下命令卸载旧版本:

[root@localhost ~]# yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-selinux 
                  docker-engine-selinux 
                  docker-engine


接着,使用yum在线安装Docker CE,执行以下命令安装依赖包:
[root@localhost ~]# yum install -y yum-utils  device-mapper-persistent-data   lvm2
鉴于国内网络问题,强烈建议使用国内源,执行下面的命令添加yum软件源:
[root@localhost ~]# yum-config-manager 
    --add-repo 
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
最后,可以安装Docker CE了。
[root@localhost ~]# yum makecache fast
[root@localhost ~]# yum install docker-ce
最后,启动 Docker CE:
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker



1、建立docker用户组
默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。出于安全考虑,一般Linux系统上不会直接使用root用户。因此,更好地做法是将需要使用docker的用户加入docker用户组。因此,首先建立docker组:
[root@localhost ~]# groupadd docker
将当前用户加入 docker 组:
[root@localhost ~]# usermod -aG docker $USER

2、测试 Docker 是否安装正确
[root@localhost ~]# docker run hello-world
若能正常输出“Hello from Docker!”以上信息,则说明安装成功。


镜像加速配置
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务
3、可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。之后重新启动服务。
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
	配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,如果从结果中看到了如下内容,说明配置成功。
[root@localhost home]# docker info
......
Registry Mirrors:
 https://registry.docker-cn.com/
Live Restore Enabled: false
Product License: Community Engine

  

镜像

镜像是最基础的,我们的容器构建都是在此基础之上

# 安装docker    
[root@Poppy ~]# yum install docker -y
[root@Poppy ~]# systemctl start docker
[root@Poppy ~]# docker pull centos    
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
7dc0dca2b151: Pull complete 
Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
Status: Downloaded newer image for docker.io/centos:latest

# 查看镜像文件
[root@Poppy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              49f7960eb7e4        4 weeks ago         200 MB
docker.io 官网的仓库,centos刚才咱们pull的镜像

# 网络比较慢的时候
导出镜像
[root@Poppy ~]# docker save 49f7960eb7e4 > /tmp/centos.tar.gz

# 导入镜像
[root@Poppy ~]# docker load < /tmp/centos.tar.gz 

# 命令解释
docker pull 其实类似git pull,它是从dockerhub上面下载,这里面是一些开发人员,运维人员制作的镜像

docker images 列出机器上所有镜像
repository 仓库
标签
image id是唯一的
创建时间
大小

docker rmi 删除镜像,可以通过image id
如果这个镜像创建了容器是不会被删除的

容器

创建容器

# 不指定名字创建容器
[root@Poppy ~]# docker run centos /bin/echo "haha"
/bin/echo "haha" 命令,如果没有写默认就是/bin/bash
1. 运行完退出了
2. 容器没有指定名字

# 查看容器运行
[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
0a1620b2b5b6        centos              "/bin/echo haha"    38 seconds ago      Exited (0) 37 seconds ago
容器id  唯一
镜像
命令
创建时间
状态
端口
名字 自动生成一个名称

# 指定名字的容器
[root@Poppy ~]# docker run --name mydocker -t -i centos /bin/bash
-t 分配一个伪终端tty
-i 容器的标准输入打开状态
执行一个命令,这个命令就是/bin/bash

[root@3da840f13444 /]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  11820  1888 ?        Ss   05:58   0:00 /bin/bash

容器的主机名就是容器的id
[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         3 minutes ago       Up 3 minutes   

首先看看本地images有没有centos镜像,如果没有就从dockerhub给你下,利用centos镜像给你启动了一个容器

退出容器

# 因为退出了/bin/bash,一个容器启动时候只能指定一个进程,这个进程退出了,生命周期结束了,容器也就结束了,所以容器适合单进程的一个东西。例如

[root@Poppy ~]# docker start 3da840f13444
3da840f13444
[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         10 minutes ago      Up 10 minutes                           mydocker
[root@Poppy ~]# docker attach 3da840f13444
[root@3da840f13444 /]# exit
exit
[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS


# 我们看到了attach进入容器之后,退出的话,容器也就结束了,我们可以用nsenter进入容器,在退出是不会退出容器的,会在后台运行
# nsenter 安装
yum install util-linux
可以访问到一个名字空间
要知道pid
[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@Poppy ~]# docker start 3da840f13444
3da840f13444
[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         14 minutes ago      Up 5 seconds                            mydocker
[root@Poppy ~]# docker inspect --format "{{.State.Pid}}" 3da840f13444    获取容器进程id
19353

[root@Poppy ~]# nsenter --help
 -t, --target <pid>     target process to get namespaces from
 -u, --uts[=<file>]     enter UTS namespace (hostname etc)
 -i, --ipc[=<file>]     enter System V IPC namespace
 -n, --net[=<file>]     enter network namespace
 -p, --pid[=<file>]     enter pid namespace

[root@Poppy ~]# nsenter -t 19353 -u -i -n -p

[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         20 minutes ago      Up 5 minutes  
还在运行

用脚本进入容器

[root@Poppy ~]# cat ns.sh 
#!/bin/bash
#PID=$(docker inspect --format "{{.State.Pid}}" $1)
PID=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $PID -u -i -n -p
[root@3da840f13444 ~]# 

删除容器

[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3da840f13444        centos              "/bin/bash"         26 minutes ago      Up 11 minutes                                   mydocker
0a1620b2b5b6        centos              "/bin/echo haha"    30 minutes ago      Exited (0) 30 minutes ago                       zen_mccarthy
[root@Poppy ~]# docker rm 0a1620b2b5b6
0a1620b2b5b6
[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         26 minutes ago      Up 11 minutes 

删除正在运行的需要 -f参数,一般不会这么干

# 还有一种方法就是在我们启动容器之后执行完命令自动删除
[root@Poppy ~]# docker run --rm centos /bin/echo "haha"
haha
[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3da840f13444        centos              "/bin/bash"         28 minutes ago      Up 14 minutes    

# 杀死全部正在的容器进程
# 获取所有运行的容器的id
[root@Poppy ~]# docker ps -a -q
3da840f13444
docker kill $(docker ps -a -q)

网络访问

1. 随机映射。 -p
2. 指定端口映射

默认docker会使用一个端口映射,让容器里面的端口对外

[root@Poppy ~]# ifconfig docker0

我们下载一个nginx镜像,然后启动一个容器,然后访问这个nginx,通过不指定端口运行

[root@Poppy ~]# docker pull nginx

-d: 后台运行容器,并返回容器ID
[root@Poppy ~]# docker run -d -P nginx  
b9cf97f289630651465fcb3ec492f32c5ea995889378d650d867f5d94bd04e59

[root@Poppy ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                   NAMES
b9cf97f28963        nginx               "nginx -g 'daemon ..."   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp   adoring_shaw
本台机子的32768端口映射到容器的80端口

[root@joker ~]# curl dock_nginx_ip:32768
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

# 容器日志
[root@Poppy ~]# docker logs b9cf97f28963
客户端IP - - [04/Jul/2018:06:54:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

我们通过指定端口运行

[root@Poppy ~]# docker run -d -p 81:80 nginx
71a13b6bfe19b9748b5f3c3b09a8da4f27ee20db56992e5e5accc10af2feb07e

[root@joker ~]# curl docker_nginx_ip:81
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

存储

数据卷

[root@Poppy ~]# docker run -it --name volume-test1 -v /data centos
[root@93955824a183 /]# ls -l /data/
total 0

# 查看容器机的物理位置
[root@Poppy ~]# docker inspect volume-test1

     "Mounts": [
            {
                "Type": "volume",
                "Name": "b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68",
                "Source": "/var/lib/docker/volumes/b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
我们创建一个文件,看是否同步
[root@Poppy _data]# touch 123
[root@Poppy _data]# pwd
/var/lib/docker/volumes/b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68/_data


[root@93955824a183 /]# ls -l /data/
total 0
-rw-r--r-- 1 root root 0 Jul  4 07:13 123

# 有点像nfs,是通过mount方式挂上去的,类似nfs

# 指定目录的挂载
[root@Poppy ~]# docker run -it -v /opt:/opt centos  
[root@1bc44740396e /]# ls /opt/   
daima

# 挂在时候还可以指定权限
/opt:/opt:ro
ro只读 rw读写

# 可以单独挂载文件
[root@Poppy ~]#  docker run -it -v ~/.bash_history:/.bash_history centos
[root@e1700ba30895 /]# history 
    1  history 
[root@e1700ba30895 /]# ll
[root@e1700ba30895 /]# history 
    1  history 
    2  ll
    3  history 

挂文件必须指定文件觉得路径~/ns.sh,然后是容器的地址
[root@Poppy ~]#  docker run -it -v ~/ns.sh:/ns.sh centos   

数据卷容器

我们说的数据卷就是在创建容器的时候指定了一个目录,而这个目录会映射到宿主机的某个位置上,而数据卷容器其实就是共享容器的数据卷

[root@Poppy ~]# docker run -d --name nfs -v /data centos
2e3ad584167e7e7c847cc372080d2c77920d92d6930e836b20bb75b3d122ab23

[root@Poppy ~]# docker run -it --name test2 --volumes-from nfs centos 
[root@41f117a8b203 /]# ls /data/

nfs
[root@Poppy ~]# docker inspect 2e3ad584167e

    "Mounts": [
            {
                "Type": "volume",
                "Name": "21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f",
                "Source": "/var/lib/docker/volumes/21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

# 我们在nfs
[root@Poppy ~]# cd /var/lib/docker/volumes/21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f/_data
[root@Poppy _data]# ls
[root@Poppy _data]# touch hello


# 在看test2的/data目录
[root@41f117a8b203 /]# ls /data/
hello

可以看出他们共用一个
数据卷容器可以停,内容依然共享

手动构建容器

首先你会有基础镜像,也就是操作系统

我们手动创建一个nginx容器

# 基础镜像 centos
[root@Poppy ~]# docker pull centos
# 创建仓容器
[root@Poppy ~]# docker run --name mynginx -it centos
https://mirrors.aliyun.com/epel/ 选择7 复制链接地址
[root@694e6ee2153b /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

[root@694e6ee2153b /]# yum install -y nginx
[root@694e6ee2153b /]# exit 

[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
694e6ee2153b        centos              "/bin/bash"              4 minutes ago       Exited (0) 16 seconds ago                            mynginx
记下id,基于这个容器做个镜像

[root@Poppy ~]# docker commit -m "my nginx" 694e6ee2153b joker/mynginx:v1

joker 在提交dockhub上需要有个用户名
mynginx 就是镜像名
v1 标签,版本

[root@Poppy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
joker/mynginx       v1                  8f96c054de4f        About a minute ago   396 MB

[root@Poppy ~]# docker run -it --name nginxv1 joker/mynginx:v1

必须要加joker了,不然就是dockerhub.io去找了
v1如果不加默认就是找last

# nginx让它前端运行,后端运行的话,退出就没了
[root@e0054021410d /]# vi /etc/nginx/nginx.conf
[root@e0054021410d /]# cat -n /etc/nginx/nginx.conf|grep daemon  
     4  daemon off;
[root@e0054021410d /]# exit

[root@Poppy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
e0054021410d        joker/mynginx:v1    "/bin/bash"              3 minutes ago       Exited (0) 18 seconds ago 

# 重新提交
[root@Poppy ~]# docker commit -m "my nginx" e0054021410d joker/mynginx:v2 
前台的 nginx

[root@Poppy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
joker/mynginx       v2                  0083e3e3eddb        24 seconds ago      396 MB

# 启动前台的nginx
[root@Poppy ~]# docker run -d -p 82:80 joker/mynginx:v2 nginx

最后的nginx就是命令,也就是代表启动nginx,如果是编译的话就需要决定路径
之前我们没有写,默认是/bash,必须要有个命令

[root@Poppy ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
f337c774ebf4        joker/mynginx:v2    "nginx"             13 seconds ago      Up 12 seconds       0.0.0.0:82->80/tcp   confident_golick

# 访问测试
[root@joker ~]# curl docker_nginx_ip:82
<h1>Welcome to <strong>nginx</strong> on Fedora!</h1>

dockerfile 构建容器

docker build /opt/nginx/Dockerfile

1. 基础镜像
2. 维护者信息
3. 镜像操作指令
4. 容器启动时执行指令

# 目录结构
[root@Poppy nginx]# pwd
/opt/dockerfile/nginx
[root@Poppy nginx]# ll
total 8
-rw-r--r-- 1 root root 352 Jul  4 17:09 Dockerfile
-rw-r--r-- 1 root root  16 Jul  4 17:09 index.html


# Dockerfile 文件写法
[root@Poppy nginx]# cat Dockerfile 
# This docker file
# VERSION 1
# Author: joker
# Base images
FROM centos

# Maintainer
MAINTAINER joker.li xxx@qq.com

# Commands
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx
ADD index.html /usr/share/nginx/html/index.html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf   前台执行
EXPOSE 80       爆漏的端口
CMD["nginx"]    启动的应用
[root@Poppy nginx]# cat index.html 
<h1>hello!</h1>

# 开始构建
[root@Poppy nginx]# docker build -t joker/mynginx:v3 .

.表示当前目录,注意add添加文件的路径,也可以写绝对路径,建议去dockerfile的目录

如果build失败,重新build,会保留之前错误前的位置,就是保留状态,是按照层一步一步往下执行的,没过一层都会有提示
Step 5/8 : ADD index.html /usr/share/nginx/html/index.html
 ---> c1b716296ec8
Removing intermediate container 2ec5ecda9930
Step 6/8 : RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 ---> Running in 36512ef47738
 
# 查看镜像
 [root@Poppy nginx]# docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
 joker/mynginx       v3                  1d8814de556c        About a minute ago   417 MB

# 指定端口映射启动容器
[root@Poppy nginx]# docker run -d -p 83:80 joker/mynginx:v3  

# 参数解释
ADD 添加文件
EXPOSE 80 开放的端口
CMD["nginx"] 容器启动以后,默认的执行的命令,如果是编译就写入绝对路径

CMD指令可以指定容器启动时要执行的命令,但它可以被docker run命令的参数覆盖掉。
ENTRYPOINT 指令和CMD类似,它也可用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。
这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。
可以看出,相对来说ENTRYPOINT指令优先级更高。 可以参考 https://www.cnblogs.com/wq3435/p/6487185.html 这个人的解释

构建好了容器,如何放在私有仓库里面呢?其他主机可直接pull镜像就可以了

构建私有仓库

# 之前是拷贝出来
dockerhub -- github 
docker regisry    /    gitlab  开源仓库

[root@Poppy ~]# docker images
docker.io/registry   latest              d1fd7d86a825        5 months ago        33.3 MB

# 仓库端口5000
[root@Poppy ~]# docker run -d -p 5000:5000 registry

# 测试能否使用
仓库是v1版本的时候
[root@Poppy ~]# curl docker_server_ip:5000/v1/search
仓库是v2版本的时候
[root@Poppy ~]# curl docker_server_ip:5000/v2/_catalog
{"repositories":[]}

# 打一个标签将镜像打到仓库里
[root@Poppy ~]# docker tag joker/mynginx:v3 docker_server_ip:5000/joker/mynginx:latest
[root@Poppy ~]# docker push docker_server_ip:5000/joker/mynginx:latest 
The push refers to a repository [docker_server_ip:5000/joker/mynginx]
Get https://docker_server_ip:5000/v1/_ping: http: server gave HTTP response to HTTPS client

# 不让push,需要https
配置nginx 用户认证 https
[root@Poppy ~]# yum install -y nginx

[root@Poppy ssl]# cat /etc/nginx/conf.d/docker-registry.conf   
upstream docker-registry {
  server 127.0.0.1:5000;
}

server {
  listen 443;
  server_name registry.joker.com;
  ssl on;
  ssl_certificate     /etc/ssl/nginx.crt;
  ssl_certificate_key /etc/ssl/nginx.key;
  proxy_set_header Host       $http_host;
  proxy_set_header X-Real-IP  $remote_addr;
  client_max_body_size 0;
  chunked_transfer_encoding on;
  location / {
    auth_basic            "Docker";
        auth_basic_user_file  /etc/nginx/conf.d/docker-registry.htpasswd;
        proxy_pass http://docker-registry;
  }
  location /_ping {
    auth_basic off;
    proxy_pass http://docker-registry;
  }
  location /v1/_ping {
    auth_basic off;
    proxy_pass http://docker-registry;
  } 
}


# 创建证书
[root@Poppy CA]# pwd
/etc/pki/CA

[root@Poppy CA]# touch ./{serial,index.txt}
[root@Poppy CA]# echo "00" > serial 

[root@Poppy CA]# openssl genrsa -out private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
..................................................+++
..................................................................+++
e is 65537 (0x10001)

# 签发根证书
[root@Poppy CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:joker
Organizational Unit Name (eg, section) []:docker
Common Name (eg, your name or your server's hostname) []:registry.joker.com
Email Address []:joker@qq.com


# 创建nginx证书
[root@Poppy ssl]# pwd
/etc/ssl
[root@Poppy ssl]# openssl genrsa -out nginx.key 2048 

[root@Poppy ssl]# openssl req -new -key nginx.key -out nginx.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:joker
Organizational Unit Name (eg, section) []:docker
Common Name (eg, your name or your server's hostname) []:registry.joker.com
Email Address []:joker@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


# 签发nginx证书
[root@Poppy ssl]# openssl ca -in nginx.csr -days 3650 -out nginx.crt

# 让系统接收一下咱们自己签发的证书
[root@Poppy ssl]# cat /etc/pki/CA/cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt 


# nginx访问用户密码
[root@Poppy ssl]# htpasswd -cb /etc/nginx/conf.d/docker-registry.htpasswd joker 123456                                      
Adding password for user joker


# 看能否认证通过
[root@Poppy ssl]#  docker login -u joker -p 12345 -e joker@qq.com registry.joker.com


# 如果出现问题
[root@Poppy ssl]# docker push docker_server_ip:5000/joker/mynginx:latest
The push refers to a repository [docker_server_ip:5000/joker/mynginx]

[root@Poppy ssl]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry docker_server_ip:5000'

加入了 --insecure-registry docker_server_ip:5000 来解决证书问题

这样就把咱们的手动创建的容器放在了私有仓库里,其他客户端在用的时候直接pull下来就可以了

最后我们就来执行?其实docker是给每个容器分出来命名空间来实现资源分离?kernel namespace

pid net ipc mnt uts user
        消息 文件系统
              
pid 不同的用户进程使用pid的namespace进行隔离,不同的namespace就可以有相同的pid
net 网络隔离,网桥,我们在启动时候不是有个网卡docker0
    通过docker ps 可以看到如下,每个docker都有一个这样的
veth15b5d77: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 4a:f6:e1:10:38:5c  txqueuelen 0  (Ethernet)
        RX packets 4718  bytes 341363 (333.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4716  bytes 10770863 (10.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ipc 进程间的交互方法
mnt 挂载
uts 独立的主机名和域名,用户态
user uid,gid

在启动容器的时候,也是可以指定资源的
-c 权重
-m 内存

最后的最后,管理docker有个可视化工具

shipyard 可以页面化管理docker,那你需要让docker监听一个tcp地址
监听tcp端口
[root@Poppy ~]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry docker_server_ip:5000 -H tcp://0.0.0.0:235 -H unix://var/run/docker.sock'

-H 指定tcp
[root@Poppy ssl]# systemctl restart docker

测试
[root@Poppy ~]# curl -s http://docker_server_ip:235/info | python -mjson.tool
之后我们就可以将shipyard下载下载安装使用
http://shipyard-project.com/

更多

https://blog.csdn.net/sch0120/article/details/53219119

原文地址:https://www.cnblogs.com/jokerbj/p/9269653.html