docker 容器

docker 簡介

   首先呢,docker是個容器,就是將你的應用跑在物理機之上,給你擴容出來的一些資源。那麼他與kvm有什麼不一樣呢?其實就是在於分配資源的形式不一樣,kvm是基於硬件資源的分配其實是物理機上運行虛擬機再開應用的一個過程,而docker是基於kernel內存級別的資源隔離。html

   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



一、創建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

二、測試 Docker 是否安裝正確
[root@localhost ~]# docker run hello-world
若能正常輸出「Hello from Docker!」以上信息,則說明安裝成功。


鏡像加速配置
國內從 Docker Hub 拉取鏡像有時會遇到困難,此時能夠配置鏡像加速器。Docker 官方和國內不少雲服務商都提供了國內加速器服務
三、能夠在 /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

  

鏡像

鏡像是最基礎的,咱們的容器構建都是在此基礎之上python

# 安裝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
若是這個鏡像建立了容器是不會被刪除的

容器

建立容器linux

# 不指定名字建立容器
[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鏡像給你啓動了一個容器

退出容器nginx

# 由於退出了/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  
還在運行

用腳本進入容器git

[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 ~]# 

刪除容器github

[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

默認docker會使用一個端口映射,讓容器裏面的端口對外json

[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

相關文章
相關標籤/搜索