docker學習及應用

1、docker發展史php

爲何要學習容器?html

在openstack以後,目前互聯網最火熱的技術莫過於docker容器了,早在2015年,京東技術備戰雙11就是使用了10萬+Docker,這兩年docker更是如日中天。docker只是容器的一種,在學習docker以前,我有必要先了解一下什麼是容器?有助於咱們更好的瞭解docker。mysql

什麼是容器:linux

容器是在隔離的環境裏面運行的一個進程,這個隔離的環境有本身的系統目錄文件,有本身的ip地址,主機名等。ios

也有人稱:容器是一種輕量級虛擬化的技術。nginx

使用容器有什麼好處?git

容器相對於kvm虛擬機的優點:github

1:容器能提供接近宿主機的性能,而kvm虛擬機會損害一部分宿主機的性能。web

2:一樣硬件配置的宿主機最多能啓動10虛擬機,那麼它能夠啓動100+容器。sql

3:啓動一臺kvm虛擬機,能夠能須要20秒,啓動一個容器只須要1秒。

4:kvm須要硬件cpu的支持,容器不須要。

linux開機啓動流程:

bios開機硬件自檢

根據bios設置的優先啓動項

讀取mbr引導

加載內核

啓動第一個進程/sbin/init

執行系統初始化腳本/etc/rc.d/rc.sysinit完成系統初始化

運行想要的服務

sshd總結:kvm虛擬機運行一個sshd服務須要完整的開機啓動流程,容器是直接啓動sshd服務,中間的流程所有精簡。

容器的發展史:

1)chroot技術chroot,即change root directory(更改 root 目錄),在 linux 系統中,系統默認的目錄結構都是以/,便是以根 (root) 開始的,而在使用chroot以後,系統的目錄結構將以指定的位置做爲/位置

2)lxc容器全稱:linux container,經過namespaces 命名空間實現的隔離環境,經過cgroups實現的資源限制,提供相似虛擬機同樣的體驗。

3)docker容器早期的docker容器底層就是調用的lxc,後期才換成了本身的libcontainer

2、lxc容器的安裝和使用

3、docker介紹和安裝

(一)docker定義

Docker是經過內核虛擬化技術(namespaces及cgroups)來提供容器的資源隔離與資源限制。

因爲Docker經過操做系統層的虛擬化實現隔離(對操做系統的內核有要求),因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,從而比kvm虛擬機更輕量。

docker是一種軟件的打包技術。

(二)docker的理念

docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,到處運行。

構建:製做docker鏡像,打包容器的全部系統目錄文件。

運輸:下載docker鏡像。

運行:基於docker鏡像提供的rootfs,啓動容器。

總結:只要能運行docker容器,那麼docker鏡像中已經安裝好的軟件也能夠運行,因此說docker是一種軟件的打包技術。

(三)docker的優勢

1:解決了操做系統和軟件運行環境的依賴nginx opensslgit openssl

2:對於開發人員來講,不再用擔憂不會部署開發環境

3:開發環境,測試環境和生產環境高度一致。

4:讓用戶體驗產品新特性的又一種思路。

(四)docker的安裝

yum源配置:
rm -fr  /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo

安裝docker-ce:
yum install docker-ce -y

(五)docker的架構

啓動docker
systemctl start docker
systemctl enable docker

docker version
docker是一個cs架構:
經過docker version來查看
docker info
docker最重要的三大組件:
鏡像,容器,倉庫

4、啓動第一個docker容器

(一)啓動第一個docker容器

docker容器是一種軟件的打包技術,接下來咱們體驗一下傳統編譯安裝nginx:官

網下載Nginx源碼包wget

tar解壓源碼包

建立Nginx用戶 安裝依賴包

編譯安裝三部曲configure,make,make install

修改nginx配置文件

啓動nginxdocker容器

docker run -d -p 80:80 nginx

[root@docker-01 ~]# docker run -d -p 80:80  nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
8ec398bc0356: Pull complete 
dfb2a46f8c2c: Pull complete 
b65031b6a2a5: Pull complete 
Digest: sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce
Status: Downloaded newer image for nginx:latest
2dcafeb781c891246564d3e23a8495b4fe8f32606240ff2acf062ae1dcd8351a
[root@docker-01 ~]#

(二)docker命令解釋

docker run -d -p 80:80 nginx

run (建立並運行一個容器)-

d 放在後臺

-p 端口映射

nginx docker鏡像的名字

(三)配置docker容器加速

配置docker鏡像加速

[root@docker-01 ~]# vim /etc/docker/daemon.json

{

"registry-mirrors": [

"https://dockerhub.azk8s.cn",

"https://reg-mirror.qiniu.com",

"https://registry.docker-cn.com"

]

}

systemctl restart docker

5、docker鏡像的經常使用命令

(一)搜索鏡像:

docker search選鏡像的建議:

1,優先考慮官方

2,starts數量多

(二)獲取鏡像

獲取鏡像:
    docker pull(push)
鏡像加速器:阿里雲加速器,daocloud加速器,中科大加速器,Docker 中國官方鏡像加速:https://registry.docker-cn.com
    
    docker pull centos:6.8(沒有指定版本,默認會下載最新版)
    docker pull daocloud.io/huangzhichong/alpine-cn:latest 

擴展:查詢docker鏡像全部版本https://hub.docker.com/r/library/

(三)docker鏡像其餘操做

查看鏡像
    docker images
docker images ls

刪除鏡像
    docker rmi  例子:docker image rm centos:latest
導出鏡像
    docker save  例子:docker image save centos > docker-centos7.4.tar.gz
導入鏡像
    docker load  例子:docker image load -i docker-centos7.4.tar.gz

6、docker容器平常管理

(一)運行一個容器

docker run -d -p 80:80 nginx:latest
run             (建立並運行一個容器)
-d                  放在後臺
-p                  端口映射
nginx:latest   docker鏡像的名字和版本
還有不少其餘的參數

docker run == docker create  + docker start

(二)、docker經常使用其餘命令

中止容器
    docker stop CONTAINER_ID
殺死容器
    docker kill container_name
查看容器列表
     docker ps
    docker ps –a 
刪除容器
    docker rm
批量刪除容器
    docker rm -f `docker ps -a -q`

(三)、docker的run擴展

docker run -it --name centos6 centos:6.8 /bin/bash
-it             分配交互式的終端
--name     指定容器的名字
/bin/sh      覆蓋容器的初始命令

--cpus       指定cpu的數量
--memory  限定內存的大小
-h              指定容器的主機名

(四)進入容器方法

進入容器的目的:排錯,調試

進入容器的方法:
    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    例子: 
    docker exec -it  容器id或容器名字 /bin/bash

    docker attach [OPTIONS] CONTAINER
    例子:
    docker attach  容器id或容器名字
    
    nsenter(安裝yum install -y util-linux 棄用)

(五)docker容器的核心理念

docker的本質是:在隔離的環境運行的一個進程

因此:docker容器內的第一個進程必須一直處於前臺運行的狀態(必須夯住),不然這個容器,就會處於退出狀態!


[root@docker-01 ~]# docker run -d -p 80:80 nginx
[root@docker-01 ~]# docker ps -a
[root@docker-01 ~]# docker container stop 35526c06959a
[root@docker-01 ~]# docker ps -a
[root@docker-01 ~]# docker run -d -p 80:80 nginx:latest
[root@docker-01 ~]# docker container kill beautiful_greider

[root@docker-01 ~]# docker run -d -p 80:80 nginx:latest
[root@docker-01 ~]# docker container stop 1a75cb5461d9
[root@docker-01 ~]# docker container rm  1a75cb5461d9
[root@docker-01 ~]# docker container rm `docker ps -a -q`
[root@docker-01 ~]# #全部退出狀態的容器刪除
[root@docker-01 ~]# docker container create nginx:latest
[root@docker-01 ~]# docker start 441a6527829e
[root@docker-01 ~]# docker run -it centos:6.8 /bin/bash
[root@docker-01 ~]# docker run -it centos:6.8
[root@ef4337be4ae9 /]# #兩邊界面相同
[root@docker-01 ~]# docker run -it centos:6.8
[root@docker-01 ~]# docker run -d centos:6.8
[root@docker-01 ~]# docker run -it centos:6.8
[root@docker-01 ~]# docker ps -a -l --no-trunc
[root@docker-01 ~]# docker run -d nginx:latest
[root@docker-01 ~]# docker run -d nginx:latest nginx -g 'daemon off'
[root@docker-01 ~]# docker run -it nginx:latest /bin/bash
[root@docker-01 ~]# docker pull alpine
[root@docker-01 ~]# docker image
[root@docker-01 ~]# docker run -it alpine:latest /bin/bash
[root@docker-01 ~]# docker run -it alpine:latest /bin/sh
[root@docker-01 ~]# docker run -d centos:6.8 tail -f /var/log/yum.log
===============
[root@docker-01 ~]# docker container attach ef4337be4ae9
[root@ef4337be4ae9 /]# #兩邊界面相同

[root@docker-01 ~]# docker exec -it 441a6527829e

7、docker容器網絡訪問

運行容器爲何要使用端口映射?

默認,狀況下,容器使用的ip是172.17.0.0/16網段的,外界的用戶只能訪問宿主機的10.0.0.0/24網段,沒法訪問172.17.0.0/16網段。

咱們運行容器的目的:是但願運行在容器中的服務,可以被外界訪問,這裏就涉及到了外網10.0.0.0/24到容器內網172.17.0.0/16網段的轉換,因此須要作端口映射。

(一)docker運行容器端口映射的方法

指定映射(docker 自動添加一條iptables規則實現端口映射)
    -p hostPort:containerPort
    -p ip:hostPort:containerPort 
    -p ip::containerPort(隨機端口)
    -p hostPort:containerPort:udp
    -p 81:80 -p 443:443 能夠指定多個-p

隨機映射
    docker run -P (隨機端口)

實例:

80端口映射到80端口:
[root@docker-01 ~]# docker run -d -p 80:80 nginx:latest
查看防火牆策略:
[root@docker-01 ~]# iptables -t nat -L -n

[root@docker-01 ~]# docker container inspect keen_austin 
[root@docker-01 ~]# curl -I 172.17.0.2

8080映射到80:
[root@docker-01 ~]# docker run -d -p 8080:80 nginx:latest
配置第二個地址:
[root@docker-01 ~]# ifconfig eth0:1 10.0.0.111/24 up

82端口映射到80:
[root@docker-01 ~]# docker run -d -p 10.0.0.11:82:80 nginx:latest
10.0.0.111地址的82端口映射到80:
[root@docker-01 ~]# docker run -d -p 10.0.0.111:82:80 nginx:latest

映射任意端口:
[root@docker-01 ~]# docker run -d -p 10.0.0.111::80 nginx:latest
[root@docker-01 ~]# netstat -lntp

查看內核參數配置:
[root@docker-01 ~]# sysctl -a | grep ipv4 | grep range

產生任意端口:
[root@docker-01 ~]# docker run -d -P nginx:latest 

[root@docker-01 ~]# docker ps 
[root@docker-01 ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
"/etc/sysctl.conf" 11L, 473C written                     
[root@docker-01 ~]# 
[root@docker-01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@docker-01 ~]# #設置在內核參數中

8、docker數據卷存儲

爲何要用docker數據卷:

數據卷的做用:

1:持久化容器運行過程當中產生的數據文件

2:實現多個容器間的文件共享。

正常狀況下,刪除容器,容器中全部的文件也會被刪除。

(一)常見的docker數據卷命令

建立一個數據卷 docker volume create

查看數據卷列表 docker volume ls

刪除一個數據卷 docker volume rm

查看一個數據卷的屬性 docker volume inspect

(二)docker數據卷應用一

docker volume create oldboy

docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest

cd /var/lib/docker/volumes/oldboy/_data/
rm -f *
wget https://www.qstack.com.cn/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip

docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest
docker run -d -p 82:80 -v oldboy:/usr/share/nginx/html nginx:latest

(三)把宿主機的目錄掛載到容器中

cd /opt
mkdir xiaoniao
cd xiaoniao/
wget https://www.qstack.com.cn/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip 

#重點
docker run -d -p 83:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest

操做實例:

[root@docker-01 ~]# docker volume ls
DRIVER              VOLUME NAME
[root@docker-01 ~]# docker volume create oldboy
oldboy
[root@docker-01 ~]# docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest
4c0b7d7c5035d88bff6c6aea00654b1f66989c6f9414f7373cf4c3ff9f5d24e0
[root@docker-01 ~]# docker ps -a -l
[root@docker-01 ~]# docker volume ls
DRIVER              VOLUME NAME
local               oldboy
[root@docker-01 ~]# docker volume inspect oldboy
[
    {
        "CreatedAt": "2020-01-13T22:58:30+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/oldboy/_data",
        "Name": "oldboy",
        "Options": {},
        "Scope": "local"
    }
]
[root@docker-01 ~]# cd /var/lib/docker/volumes/oldboy/_data/
[root@docker-01 _data]# ls
50x.html  index.html
[root@docker-01 _data]# rm *
[root@docker-01 _data]# wget https://www.qstack.com.cn/xiaoniaofeifei.zip
[root@docker-01 _data]# unzip xiaoniaofeifei.zip
[root@docker-01 /]# docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest
dddf5dbcdf6eddc181c2719f174825dcf9ab184cc3464f46a599a96c4c4807d4
[root@docker-01 /]# docker run -d -p 82:80 --volumes-from charming_jackson nginx:latest
90e64512a67e58c369866d38d3d8cf70fafe270f4ec35f914679da7db19894a5
[root@docker-01 /]# docker ps -a -q
[root@docker-01 /]# docker rm -f `docker ps -a -q`

9、手動製做docker鏡像

(一)製做docker鏡像的步驟

製做docker鏡像步驟:

1:啓動容器安裝軟件服務

2:將安裝好服務的容器commit提交爲鏡像

3: 啓動新容器來測試新提交的鏡像

(二)製做支持ssh遠程登錄的docker鏡像

製做docker鏡像步驟:
1:啓動容器安裝軟件服務
docker run -it -p 1022:22 --name oldboy centos:6.9 
######
yum install openssh-server
/etc/init.d/sshd start
passwd 
######

2:將安裝好服務的容器commit提交爲鏡像
docker commit oldboy centos6-ssh:v1

3:   啓動新容器來測試新提交的鏡像
docker run -d -p 2022:22 centos6-ssh:v1  /usr/sbin/sshd -D

(三)製做支持ssh+httpd雙服務的鏡像

1:啓動容器安裝軟件服務
docker run -it --name oldgirl centos:6.9 
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
passwd 

###容器啓動腳本
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D

2:將安裝好服務的容器commit提交爲鏡像
docker commit oldgirl centos6-ssh-httpd:v1

3:啓動新容器來測試新提交的鏡像
docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh

(四)實例

[root@docker-01 /]# docker pull centos:6.9
[root@docker-01 /]# yum install openssh-server -y
[root@docker-01 /]# docker run -it -p 1022:22 --name oldboy centos:6.9
[root@3af911405c61 /]# yum install openssd-server -y
[root@3af911405c61 /]# /etc/init.d/sshd start
[root@3af911405c61 /]# netstat -lntp
[root@3af911405c61 /]# echo 123456 | passwd --stdin root
[root@docker-01 ~]# ssh root@10.0.0.11 -p 1022
[root@docker-01 /]# docker commit oldboy centos6_ssh:v1
[root@docker-01 ~]# docker run -d -p 2022:22 centos6_ssh:v1 /usr/sbin/sshd -D
381f2b966a516286185e23e5f9514fe0a88c7c8791b3d5f37cbe168e51d349a9
[root@docker-01 /]# docker ps -a -l
[root@docker-01 /]# ssh root@10.0.0.11 -p 2022
[root@docker-01 /]# docker run -it -p 1122:22 -p 8080:80 --name oldgirl centos:6.9
[root@00dbe3e92f11 /]# yum install openssh-server -y
[root@00dbe3e92f11 /]# /etc/init.d/sshd start
[root@00dbe3e92f11 /]# yum install httpd -y
[root@00dbe3e92f11 /]# vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker-01 ~]# docker commit oldgirl centos6_ssh_http:v1
[root@docker-01 ~]# docker run -d -p 1222:22 -p 8090:80 centos6_ssh_http:v1 /bin/bash /init.sh
[root@docker-01 ~]# curl -I 10.0.0.11:8090
[root@docker-01 ~]# ssh root@10.0.0.11 -p 1222

10、dockerfile自動構建鏡像

相對於手動製做的docker鏡像,使用dockerfile構建的鏡像有如下優勢:

1:dockerfile只有幾kb,便於傳輸

2:使用dockerfile構建出來的鏡像,在運行容器的時候,不用指定容器的初始命令

3:支持更多的自定義操做

(一)dockerfile經常使用指令

dockerfile經常使用指令:
    FROM 這個鏡像的媽媽是誰?(指定基礎鏡像)
    MAINTAINER 告訴別人,誰負責養它?(指定維護者信息,能夠沒有)
    RUN 你想讓它幹啥(在命令前面加上RUN便可)
    ADD 給它點創業資金(COPY文件,會自動解壓)
    WORKDIR 我是cd,今天剛化了妝(設置當前工做目錄)
    VOLUME 給它一個存放行李的地方(設置卷,掛載主機目錄)
    EXPOSE 它要打開的門是啥(指定對外的端口)(-P 隨機端口)
    CMD 奔跑吧,兄弟!(指定容器啓動後的要乾的事情)(容易被替換)
    
dockerfile其餘指令: 
    COPY 複製文件
    ENV  環境變量
    ENTRYPOINT  容器啓動後執行的命令(沒法被替換,啓容器的時候指定的命令,會被當成參數)

(二)dockerfile實戰(手工製做)

手動製做docker鏡像步驟:
1:啓動容器安裝軟件服務
docker run -it -p 1022:22 --name oldboy centos:6.9 
######
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456|passwd  --stdin root 
######

2:將安裝好服務的容器commit提交爲鏡像
docker commit oldboy12 centos6-ssh:v1

3:   啓動新容器來測試新提交的鏡像
docker run -d -p 2022:22 centos6-ssh:v1  /usr/sbin/sshd -D

手工製做:
[root@docker-01 ~]# docker run -it -p 1022:22 --name oldboy12 centos:6.9
[root@89ea5fa56348 /]# yum install openssh-server -y
[root@89ea5fa56348 /]# /etc/init.d/sshd start
[root@89ea5fa56348 /]# echo 123456|passwd  --stdin root
[root@89ea5fa56348 /]# exit
exit
[root@docker-01 ~]# docker commit oldboy12 centos6-ssh:v1
[root@docker-01 ~]# docker ps -l
[root@docker-01 ~]# docker run -d -p 2023:22 centos6-ssh:v1  /usr/sbin/sshd -D
[root@docker-01 ~]# ssh root@10.0.0.11 -p 2023

(三)dockerfile實戰

[root@docker-01 kop]# cat dockerfile 
FROM  centos:6.9
RUN   yum install httpd php php-cli php-gd php-mbstring unzip -y
WORKDIR  /var/www/html
COPY     kodexplorer4.37.zip .
RUN      unzip kodexplorer4.37.zip
RUN      chmod -R 777 /var/www/html/
ADD      init.sh  /init.sh
EXPOSE   80 22
CMD      ["/bin/bash","/init.sh"]

[root@docker-01 kop]# cat init.sh 
#!/bin/bash
/etc/init.d/httpd start
tail -F /var/log/httpd/access_log
[root@docker-01 kop]#

11、docker私有倉庫registry

(一)運行docker私有倉庫

運行docker私有倉庫:docker run -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry當容器啓動完成,私有倉庫就可使用了

(二)上傳鏡像到私有倉庫

上傳到私有倉庫的步驟:

a:給要上傳的鏡像打tag10.0.0.12:5000/httpd:latest (手動給它打tag)

b:上傳docker push 10.0.0.12:5000/httpd:latest

報錯解決方法:vi /etc/docker/daemon.json{ "registry-mirrors": ["https://registry.docker-cn.com"],

"insecure-registries": ["10.0.0.12:5000"]}

systemctl restart docker

(三)帶base認證的私有倉庫

a:base認證密碼文件準備
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd  -Bbn oldboy 123456  >> /opt/registry-var/auth/htpasswd

b:啓動docker私有倉庫
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 

----------------------
a:base認證密碼文件準備
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd  -Bbn oldboy 123456  >> /opt/registry-var/auth/htpasswd

b:啓動docker私有倉庫
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

(四)實戰

①
[root@docker-02 ~]# docker run -d -p 5000:5000 --restart=always  -v /opt/myregistry:/var/lib/registry  registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
c87736221ed0: Pull complete 
1cc8e0bb44df: Pull complete 
54d33bcb37f5: Pull complete 
e8afc091c171: Pull complete 
b4541f6d3db6: Pull complete 
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
65fecd20716b2d75419fe47e29068ccf0eb2205919baae9fe70d27894638019b
[root@docker-02 ~]# 
②
[root@docker-02 ~]# docker pull daocloud.io/huangzhichong/alpine-cn:latest
latest: Pulling from huangzhichong/alpine-cn
0a8490d0dfd3: Pull complete 
8881e0c6b9b8: Pull complete 
Digest: sha256:57c79fbd51aac09ea307ba6ddbbb4cc60f49e015d261193bacff95f9fa39d88c
Status: Downloaded newer image for daocloud.io/huangzhichong/alpine-cn:latest
daocloud.io/huangzhichong/alpine-cn:latest
[root@docker-02 ~]# cd /opt/myregistry/docker/registry/v2/
[root@docker-02 v2]# ll
total 0
drwxr-xr-x 3 root root 20 Jan 17 20:27 blobs
drwxr-xr-x 3 root root 19 Jan 17 20:27 repositories
[root@docker-02 v2]# cd repositories/
[root@docker-02 repositories]# ll
total 0
drwxr-xr-x 5 root root 55 Jan 17 20:28 httpd
[root@docker-02 repositories]# 
[root@docker-02 repositories]# ll
total 0
drwxr-xr-x 5 root root 55 Jan 17 20:31 centos
drwxr-xr-x 5 root root 55 Jan 17 20:28 httpd
[root@docker-02 repositories]# tree httpd/_manifests/tags/
③
[root@docker-02 repositories]# yum install httpd-tools -y
[root@docker-02 repositories]# mkdir /opt/registry-var/auth/ -p
[root@docker-02 repositories]# htpasswd  -Bbn oldboy 123456  >> /opt/registry-var/auth/htpasswd
[root@docker-02 repositories]# 
[root@docker-02 repositories]# 
[root@docker-02 repositories]# docker ps
[root@docker-02 repositories]# docker kill 65fecd20716b
65fecd20716b
[root@docker-02 repositories]# docker rm 65fecd20716b
[root@docker-02 repositories]# 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
b567add48840af43273382cd5d5459c0b321d696b71c8875e4e360b023fa7297
[root@docker-02 repositories]# docker ps
④
[root@docker-01 kop]# docker images 
[root@docker-01 kop]# docker image tag httpd:latest 10.0.0.12:5000/httpd:latest
[root@docker-01 kop]# docker images 
[root@docker-01 kop]# docker push 10.0.0.12:5000/httpd:latest
The push refers to repository [10.0.0.12:5000/httpd]
Get https://10.0.0.12:5000/v2/: http: server gave HTTP response to HTTPS client
[root@docker-01 kop]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com",
    "https://registry.docker-cn.com"
  ],
"insecure-registries": ["10.0.0.12:5000"]

}
[root@docker-01 kop]# systemctl restart docker
[root@docker-01 kop]# docker push 10.0.0.12:5000/httpd:latest
The push refers to repository [10.0.0.12:5000/httpd]
⑤
[root@docker-01 opt]# docker tag centos:6.8 10.0.0.12:5000/centos:6.8
[root@docker-01 opt]# docker push 10.0.0.12:5000/centos:6.8
[root@docker-01 opt]# docker rmi centos:6.8 10.0.0.12:5000/centos:6.8 
Untagged: centos:6.8
Untagged: centos@sha256:39abd0c8e375de6fb7334d42ec2a46643f34cbc1bbaf37e2b484065f05eaa7a2
Error response from daemon: conflict: unable to remove repository reference "10.0.0.12:5000/centos:6.8" (must force) - container 33d9dfd21a81 is using its referenced image 82f3b5f3c58f
[root@docker-01 opt]# docker rm 33d9dfd21a81
33d9dfd21a81
[root@docker-01 opt]# docker rmi centos:6.8 10.0.0.12:5000/centos:6.8 
[root@docker-01 opt]# docker login 10.0.0.12:5000
Login Succeeded
[root@docker-01 opt]# cat /root/.docker/config.js
[root@docker-01 opt]#docker pull 10.0.0.12:5000/centos:6.8
[root@docker-01 opt]# docker images

12、容器編排docker-compose

(一)docker-compose安裝

[root@docker-01 opt]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    510      0 --:--:--  0:00:01 --:--:--   511
  0 15.4M  100 15.4M    0     0   191k      0  0:01:22  0:01:22 --:--:--  201k
▽root@docker-01 opt]# chmod +x /usr/local/bin/docker-compose
[root@docker-01 opt]# docker-compose -v
docker-compose version 1.24.1, build 4667896b


[root@docker-01 mywordpress]# vim docker-compose.yml
vi 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"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    web_data:

==================

[root@docker-01 mywordpress]# docker-compose up
[root@docker-01 mywordpress]# docker-compose up -d
[root@docker-01 mywordpress]# docker-compose scale wordpress=3
[root@docker-01 mywordpress]# docker ps

nginx安裝

[root@docker-02 repositories]# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

[root@docker-02 repositories]# sudo yum install -y nginx
配置文件:
[root@docker-02 nginx]# cat nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream wordpress {
    server 10.0.0.11:32769;
    server 10.0.0.11:32770;
    server 10.0.0.11:32771;
}
    server {
          listen       80;
          server_name  localhost;
          location / {
              proxy_pass       http://wordpress;
              proxy_set_header Host $host;
              proxy_set_header X-Real-Ip $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          } 
  }
}
[root@docker-02 nginx]# 
[root@docker-02 nginx]# systemctl start nginx

在目錄下配置測試文件:

[root@docker-01 _data]# pwd
/var/lib/docker/volumes/mywordpress_web_data/_data
[root@docker-01 _data]# cat info.php 
<?php phpinfo(); ?>
[root@docker-01 _data]# 
不停刷新頁面發現地址代理地址不一樣:
http://10.0.0.12/info.php

十3、容器的四種網絡類型

None:不爲容器配置任何網絡功能,--net=none

Container:與另外一個運行中的容器共享Network Namespace,--net=container:containerID

Host:與主機共享Network Namespace,--net=host

Bridge:Docker設計的NAT網絡模型(默認)


[root@docker-01 _data]# docker run -it --network none busybox:latest
檢查網絡類型:
docker ps -a -l
docker inspect competent_lewin

----
[root@docker-01 _data]# docker run -d httpd:latest
dbf395b9b91dbc83fdf16535d686a2e3172520022fe9142edbef0461ea11f53c
[root@docker-01 _data]# docker run -it --network container:charming_antonelli 10.0.0.12:5000/centos:6.8 ([root@docker-01 ~]# docker ps -a -l
查出name)
[root@dbf395b9b91d /]# netstat -lntp
[root@docker-01 ~]# docker ps -a -l
CONTAINER ID        IMAGE                       COMMAND             CREATED              STATUS              PORTS               NAMES
f09de4357455        10.0.0.12:5000/centos:6.8   "/bin/bash"         About a minute ago   Up About a minute                       charming_feynman
[root@docker-01 ~]# docker inspect f09de4357455
network爲空。

host:
[root@docker-01 _data]# docker run -it --network host 10.0.0.12:5000/centos:6.8
[root@docker-01 /]# ifconfig 
跟宿主機共用。

十4、跨主機通訊之macvlan

macvlan定義:

macvlan 自己是 linux kernel 模塊,其功能是容許在同一個物理網卡上配置多個 MAC 地址,即多個 interface,每一個 interface 能夠配置本身的 IP。

macvlan 本質上是一種網卡虛擬化技術

使用macvlan實現容器跨主機通訊:

建立macvlan:(兩臺主機都須要)
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1

測試:
docker01:
docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
docker02:
docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh



[root@docker-01 _data]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
41476f94745165b43591760a9fe4541d0bf13d1c3498f84bd4daa8aa14fafe0f
[root@docker-01 _data]# docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
e3f7c473d255        bridge                bridge              local
ed8ed81588ce        host                  host                local
41476f947451        macvlan_1             macvlan             local
e8e53247c464        mywordpress_default   bridge              local
e6e9a262ab5f        none                  null                local
[root@docker-01 _data]# docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh



[root@docker-02 nginx]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
2644c26dbacfe64add4eba8a792fcaee04384d08255918590367569fe5058cd9
[root@docker-02 nginx]# 
[root@docker-02 nginx]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e60a56edfd03        bridge              bridge              local
85abdf640cbc        host                host                local
2644c26dbacf        macvlan_1           macvlan             local
daa49e0aaede        none                null                local
[root@docker-02 nginx]# docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh

開啓混雜模式:
[root@docker-01 _data]# ip link set eth0 promisc on
[root@docker-01 _data]# ip link show eth0

十5、跨主機容器間通訊之overlay

1)準備工做
docker03上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

docker0一、02上:
vim  /etc/docker/daemon.json
{
  "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
  "cluster-store": "consul://10.0.0.13:8500",
  "cluster-advertise": "10.0.0.11:2376",
  "insecure-registries": ["10.0.0.11:5000"]
}

2)建立overlay網絡
docker network create -d overlay ol1

3)啓動容器測試
docker run -it --network ol1 --name oldboy02  busybox:latest /bin/sh

十6、企業級私有倉庫harbor

harbor-offline-installer-v1.5.1.tgz
連接:https://pan.baidu.com/s/1Z9I7zYXSt-8ve3lFT2YCeg 
提取碼:iuqj 

第一步:安裝docker和docker-compose

第二步:下載harbor-offline-installer-v1.5.1.tgz

第三步:上傳到/opt,並解壓

第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456

第五步:執行install.sh
###
./install.sh

推送鏡像:
[root@docker-02 _data]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com",
    "https://registry.docker-cn.com"
  ],
"insecure-registries": ["10.0.0.12:5000"],
"insecure-registries": ["10.0.0.11"]
[root@docker-02 _data]# systemctl restart docker

docker login 10.0.0.11

[root@docker-02 kop]# docker images 
[root@docker-02 kop]# docker image tag busybox:latest 10.0.0.11/library/busybox:latest
[root@docker-02 kop]# docker images 
[root@docker-02 kop]# docker push busybox:latest 10.0.0.11/library/busybox:latest
登陸web頁面檢查,是否推送成功。
下來鏡像:
[root@docker-02 _data]# vim /etc/docker/daemon.json 
"insecure-registries": ["10.0.0.11"]
[root@docker-02 _data]# systemctl restart docker
直接複製web頁面,讓後在須要主機上黏貼。
相關文章
相關標籤/搜索