docker容器企業級實戰——docker部署與操作實踐

docker介紹

什麼是docker

Docker使用Go語言開發,基於Linux內核的cgroupnamespace以及Unionfs等技術,對進程進行封裝隔離,屬於操作系統層面的虛擬化技術,由於隔離的進程獨立於宿主和其它的隔離的進程,因此也稱其爲容器

表項 含義
cgroup 爲每個進程容器分配不同的系統資源,例如CPU和內存
namespace 隔離內核資源,是linux內核合理資源的方式
Unionfs 聯合文件系統,把不同物理位置的目錄合併mount到同一個目錄中
特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 一般爲MB 一般爲GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 一般幾十個

docker概念

(1)鏡像

Docker鏡像是特殊的文件系統,提供容器運行時所需的文件(程序、庫、資源、配置等)和配置參數(如匿名卷、環境變量、用戶等)

  • 分層存儲
    各層通過聯合文件系統做統一掛載,使鏡像複用、定製更容易
  • 靜態
    每層只能讀,不能寫
    (2)容器

容器是鏡像運行起來的實例

  • 動態
    有生命週期,創建、啓動、暫停、停止、刪除
  • 存在可寫層
    容器運行後做的修改保存在了可寫層
    (3)鏡像倉庫

存儲鏡像

  • 鏡像一次構建,處處使用
  • 分爲公有倉庫和私有倉庫

docker存在的問題

(1)docker容器何如實現容災
(2)docker容器的連通複雜

k8s —>docker容器容災 故障切換,負載均衡
pod—>對於容器簡單化

Docker安裝部署

yum安裝

[root@docker ~]# uname -r
4.4.223-1.el7.elrepo.x86_64
[root@docker ~]# yum repolist
!extras/7/x86_64   	CentOS-7 - Extras - 163.com   	323
[root@docker ~]# yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
#設置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看所有倉庫中所有docker版本
yum list docker-ce --showduplicates | sort -r
#安裝docker
yum install -y docker-ce[-17.12.0.ce]	#最新穩定版,可直接指定安裝版本
#啓動並加入開機啓動
systemctl start docker && systemctl enable docker
[root@docker ~]# docker --version

腳本安裝

[root@docker ~]# curl -sSL get.docker.com -o get-docker.sh
[root@docker ~]# sh get-docker.sh  --mirror Aliyun
systemctl start docker
systemctl enable docker
[root@docker ~]# docker version

Docker基本操作

配置鏡像加速器

[root@docker ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"]
}
[root@docker ~]# systemctl daemon-reload && systemctl restart docker

“Hello world”

(1)獲取鏡像

[root@docker ~]# docker pull ubuntu:15.10
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              15.10               9b9cb95443b5        3 years ago         137MB

(2)在容器內運行應用程序

[root@docker ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
#Docker以ubuntu15.10鏡像創建一個新容器,然後在容器裏執行bin/echo "Hello world",輸出結果(不指定版本號,會默認找最新版本)
#若鏡像不存在,會從鏡像倉庫下載

(3)運行交互式的容器

[root@docker ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
[root@docker ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@25177d9abcfb:/# uname -a
Linux 25177d9abcfb 4.4.223-1.el7.elrepo.x86_64 #1 SMP Sat May 9 08:36:51 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
root@25177d9abcfb:/# exit	#Ctrl+D
exit

(4)後臺啓動容器

[root@docker ~]# docker run -d ubuntu:15.10
e6453eed8242e539c583573bab0409dc72807c1fcdf80c157b91114c26a5d62e	#容器ID
[root@docker ~]# docker ps -all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
e6453eed8242        ubuntu:15.10        "/bin/bash"         59 seconds ago      Exited (0) 59 seconds ago                       condescending_raman
[root@docker ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1;done"
cc507d3ef326a228dc7d50a7fb8ffff3ac695569ad81f02aa79f026e27f54cd2
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cc507d3ef326        ubuntu:15.10        "/bin/sh -c 'while t…"   10 seconds ago      Up 9 seconds                            goofy_shirley

查看容器內的標準輸出

[root@docker ~]# docker logs goofy_shirley	#容器名稱
[root@docker ~]# docker logs cc507d3ef326	#容器ID

(5)停止容器

[root@docker ~]# docker stop cc507d3ef326
cc507d3ef326
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker ~]# docker ps -all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
cc507d3ef326        ubuntu:15.10        "/bin/sh -c 'while t…"   4 minutes ago       Exited (137) 9 seconds ago                       goofy_shirley
[root@docker ~]# docker start cc507d3ef326
[root@docker ~]# docker stop goofy_shirley
goofy_shirley
[root@docker ~]# docker rm cc507d3ef326	#刪除時容器必須是停止的
cc507d3ef326

Docker容器使用

(1)在docker容器中運行一個Python Flask應用來運行一個web應用

[root@docker ~]# docker pull training/webapp
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              15.10               9b9cb95443b5        3 years ago         137MB
training/webapp     latest              6fae60ef3446        5 years ago         349MB
[root@docker ~]# docker run -d -P training/webapp python app.py	#-P 將容器內部使用的網絡端口映射到我們使用的主機上
1ac039180e5fec2556b220697a4066f530785659743ae2d4448bb39d7bfa9e35
[root@docker ~]# docker run -d -p 80:5000 training/webapp python app.py
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1ac039180e5f        training/webapp     "python app.py"     15 seconds ago      Up 14 seconds       0.0.0.0:32768->5000/tcp   crazy_murdock
[root@docker ~]# docker logs 1f839cb8906f
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.213.1 - - [15/May/2020 07:57:05] "GET / HTTP/1.1" 200 -
192.168.213.1 - - [15/May/2020 07:57:05] "GET /favicon.ico HTTP/1.1" 404 -
[root@docker ~]# docker logs -f 1f839cb8906f	#動態打印日誌
[root@docker ~]# docker top 1f839cb8906f	#查看容器內部運行的進程
[root@docker ~]# docker inspect 1f839cb8906f	#查看docker的底層信息
[root@docker ~]# docker ps -l	#查看最後一次創建的容器

在這裏插入圖片描述

Docker鏡像使用

當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從docker鏡像倉庫中下載,默認是從Docker Hub公共鏡像源下載
(1)管理和使用本地Docker主機鏡像

命令 含義
docker images 列出本地主機上的鏡像
docker pull ubuntu:15.10 獲取一個新的鏡像
docker search nginx 查找鏡像

(2)創建鏡像

  1. 從已經創建的容器中更新鏡像,並且提交這個鏡像
[root@docker ~]# docker run -t -i ubuntu:15.10 /bin/bash
root@34596cb30007:/# apt-get update
  1. 使用Dockerfile指令來創建一個新的鏡像
[root@docker ~]# cat Dockerfile
FROM    centos:6.7	#指定鏡像源
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd zhao
RUN     /bin/echo 'zhao:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
#每一個指令都會在鏡像上創建一個新的層,指令的前綴必須大寫
#RUN指令告訴docker在鏡像內執行命令,安裝了什麼
[root@docker ~]# docker build -t zhao/centos6.7 .	#-t 指定要創建的目標鏡像名,. Dockerfile文件所在目錄
  1. 更新鏡像
[root@f4a95aa4fb3d ~]# yum update
[root@docker ~]# docker commit -m="has update" -a="zhao" f4a95aa4fb3d zhao/centos-ansible:v1.0	#容器ID通過docker ps查看
  1. 設置鏡像標籤
[root@docker ~]# docker tag 9e528daf9660 zhao/centos6.7:v1.1

Docker鏡像連接

[root@docker ~]# ip a |grep docker
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
[root@docker ~]# yum install bridge-utils
[root@docker ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02425763b98b       no
#可以對docker0進行修改,使之成爲我們希望的網段
[root@docker ~]# ifconfig dockerO IP netmask NATMASK

docker守護進程就是通過docker0爲docker容器提供網絡連接的各種服務,docker0實質是Linux的虛擬網橋,可以設置IP地址,相當於擁有一個隱藏的虛擬網卡

[root@docker ~]# docker run -it --name container1 centos:6.7 /bin/bash
[root@docker ~]# docker run -it --link container1:container1 --name container2 ansible/centos7-ansible /bin/bash

dockerfile操作

dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本

每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數指令按照從上到下,順序執行
#表示註釋。
每條指令都會創建-一個新的鏡像層,並對鏡像進行提交

Docker執行Dockerfile的大致流程

  • docker從基礎鏡像運行一個容器
  • 執行一條指令並對容器作出修改
  • 執行類似docker commit的操作提交一個新的鏡像層
  • docker再基於剛提交的鏡像運行一個新容器
  • 執行dockerfile中的下一條指令直到所有指令都執行完成

Dockerfile命令語法

https://docs.docker.com/engine/reference/builder/#user
(1)FROM
指定基礎鏡像,必須是第一條指令

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
#三種寫法,其中<tag>和<digest>是可選項,如果沒有選擇,那麼默認值爲latest
#不以任何鏡像爲基礎:FROM scratch

(2)RUN
運行指定的命令

RUN <command>	#在linux操作系統上默認/bin/sh -C,在windows操作系統上默認cmd /S /C
RUN ["executable","param1","param2"]	#executable可執行文件,兩個參數

RUN yum install httpd -y	#/bin/bash -c yum install httpd -y
RUN ["/bin/bash","-c","yum install vim -y"]

1.多行命令不要寫多個RUN,因爲Dockerfile中每一個指令都會建立一層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯
2.RUN書寫時的換行符是\

RUN tar && mkdir && cd && prefix && make && make install

(3)CMD
容器啓動時要運行的命令

CMD ["executable", "param1"," param2"]
CMD ["param1","param2"]
CMD command param1 param2

注意:包括參數的一定要用雙引號, 原因是參數傳遞後,docker解析的是一個JSON array

RUN & CMD對比
RUN是構件容器時就運行的命令以及提交運行結果;CMD是容器啓動時執行的命令,在構件時並不運行,構件時僅僅指定了這個命令到底是個什麼樣子

(4)LABEL
爲鏡像指定標籤

LABEL <key>=<value> <key>=<value> <key>=<value>
一個Dockerfile種可以有多個LABEL,如下:
LABEL version="test_v1.0" \
description="This is a test v1.0.." \
author="zhao"
#LABEL會繼承基礎鏡像的LABEL,如遇到key相同,則值覆蓋

(5)MAINTAINER
指定作者

MAINTAINER <name>

(6)EXPOSE
暴露容器運行時的監聽端口給外部
但是EXPOSE並不會使容器訪問主機的端口,如果想使得容器與主機的端口有映射關係,必須在容器啓動的時候加上-P參數

EXPOSE 111
EXPOSE 4096
[root@docker ~]# docker run -it -d fa90e483fb82 /bin/bash
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6d1cb3992267        fa90e483fb82        "/bin/bash"         7 seconds ago       Up 6 seconds        111/tcp, 4096/tcp   agitated_hamilton

(7)ENV
設置環境變量

ENV <key> <value>	#一次設置一個
ENV <key>=<value>	#一次設置多個

(8)ADD
複製命令,把文件複製到鏡像中(類似於scp,但不需密碼)

ADD <src>. .. <dest>
ADD ["<src>",... "<dest>"]
ADD http://example.com/foobar /usr/local
ADD *.txt /usr/local

工作路徑: 進入到鏡像所對應的容器後的當前路徑

1.dest路徑可以是容器內的絕對路徑,也可以是相對於工作目錄的相對路徑
2.src可以是本地文件,也可以是一個url(類似於wget命令)
3.儘量不要把src寫成一個文件夾,否則會複製整個目錄的內容,包括文件系統元數據
4.add命令可以自解壓
5.add上傳目錄時只上傳其中的文件,不上傳目錄;可在dest中加上目錄名稱已達到有目錄的效果
6.add添加文件時,按照build上下文查找

build上下文:docker build命令的PATH或URL指定的路徑中的文件的集合,如.當前路徑,在指向ADD命令時,將當前路徑下的文件傳遞到server
(9)COPY
複製命令

COPY <src>... <dest>
COPY ["<src>",..."<dest>"]

COPY&&ADD對比
(1) ADD的兩大特性:拷貝時可自動解壓文件;可傳遞url
(2) copy應用於multistage場景下,只能是本地文件
(3) ADD和copy都能支持go語言風格的正則,都將傳遞Build上下文,只複製目錄下的內容不包含目錄本身

Dockerfile中的multi-stage(多階段構建)

  1. 在容器化技術的軟件開發過程中,不得不考慮如何控制容器鏡像的大小,若構建的鏡像既是編譯軟件的環境,又是軟件最終的運行環境,那是很難控制大小的
  2. 一般思路是分別爲軟件的編譯環境和運行環境提供不同的容器鏡像,這種情況被稱爲構建者模式

(10) ENTRYPOINT
啓動時的默認命令

ENTRYPOINT ["executable","param1","param2"]	#可執行文件加參數
ENTRYPOINT command param1 param2	#shell命令

(11)VOLUME
可實現掛載功能,可以將本地文件夾或者其他容器中得文件夾掛在到這個容器

VOLUME ["/data"]
#["/data"]可以是一個JsonArray,也可以是多個值
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db

一般的使用場景爲需要持久化存儲數據時,容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉後,所有的更改都會丟失,所以當數據需要持久化時用這個命令

(12)USER
設置啓動容器的用戶,可以是用戶名或UID

USER daemo
USER UID

注意:如果設置了容器以daemon用戶去運行,那麼RUN,CMD 和ENTRYPOINT 都會以這個用戶去運行

(13)WORKDIR
設置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效,如果不存在則會創建,也可以設置多次

WORKDIR /path/to/workdir

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#pwd執行的結果是/a/b/c 

WORKDIR也可以解析環境變量

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
#pwd的執行結果是/path/$DIRNAME

(14)ARG
設置變量

ARG <name> [=<default value>] 

ARG命令定義了一個變量,在docker build創建鏡像的時候,使用--build-arg<varname>=<value>來指定參數

如果用戶在build鏡像時指定了一個參數沒有定義在Dockerfile中,那麼將有一個警告[Warning] one or more build-args [foo] were not consumed.

我們可以定義一個或多個參數,如下:
FROM busybox
ARG user1
ARG buildno

也可以給參數一個默認值:
FROM busybox
ARG user1=someuser
ARG buildno=1

如果給了ARG定義的參數默認值,那麼當build鏡像時沒有指定參數值,將會使用這個默認值

例1

ARG name=vim
RUN ["/bin/bash","-c","yum install $name -y"]
[root@docker ~]# docker build -t zhao/centos_test:v6.0 --build-arg name=net-tools .
Step 7/7 : RUN ["/bin/bash","-c","yum install $name -y"]

在這裏插入圖片描述
例2

ARG path=/usr/local
WORKDIR $path
[root@docker ~]# docker build -t zhao/centos_test:v7.0 --build-arg path=/var .
[root@docker ~]# docker run -it zhao/centos_test:v7.0 /bin/bash
[root@569886c09a13 var]# pwd
/var

(15)ONBUILD
這個命令只對當前鏡像的子鏡像生效

ONBUILD [INSTRUCTION]

ONBUILD RUN yum install net-tools -y
[root@docker ~]# docker build -t zhao/centos_test:v8.0 .
[root@docker ~]# cat Dockerfile
FROM zhao/centos_test:v8.0
[root@docker ~]# docker build -t zhao/centos_test:v8.1 .

在這裏插入圖片描述
(16)STOPSIGNAL
當容器退出時給系統發送什麼樣的指令

STOPSIGNAL signal 

(17)HEALTHCHECK
容器健康狀況檢查命令

HEALTHCHECK [OPTIONS] CMD command	#在容器內部運行一個命令來檢查容器的健康狀況
HEALTHCHECK NONE	#在基礎鏡像中取消健康檢查命令

[OPTIONS]選項:
--interval=DURATION #兩次檢查默認的時間間隔爲30秒
--timeout=DURATION #健康檢查命令運行超時時長,默認30秒
--retries=N #當連續失敗指定次數後,則容器被認爲是不健康的,狀態爲unhealthy,默認次數是3

HEALTHCHECK命令只能出現一次,如果出現了多次,只有最後一個生效
CMD後邊的命令的返回值決定了本次健康檢查是否成功,具體的返回值如下:
0 success-表示容器是健康的
1 unhealthy-表示容器已經不能工作了
2 reserved-保留值

dockerfile總結

https://docs.docker.com/develop/develop-images/multistage-build/

dockerfile實例解析

構建鏡像三步驟

  • 編寫dockerfile文件
  • docker build
  • docker run

自定義mycentos

(1)編寫dockerfile文件

from centos
env mypath /usr/local
workdir $mypath
run yum -y install vim
run yum -y install net-tools
expose 80
cmd echo "=======SUCCeSS---"
cmd /bin/bash

(2)構建鏡像

docker build -t新鏡像名字:TAG

(3)列出鏡像變更歷史

docker history 鏡像名

自定義tomcat

https://download.csdn.net/download/u013567994/10607545

FROM centos
MAINTAINER zhao
#把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u842-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.53.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設置工作訪問時候的WORKDIR路徑,登錄落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_242
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.53
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.53
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的端口
EXPOSE 8080
/#啓動時運行tomcat
# ENTRYPOINT ["/usr/1ocal/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh", "run"]
CMD /usr/local/apache-tomcat-8.5.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.53/bin/logs/catalina.out

build一個新鏡像

[root@docker ~]# docker build -t zhao/centos_test:v11.0 .

運行

[root@docker ~]# mkdir -p /zyuse/mydockerfile/tomcat8/test
[root@docker ~]# mkdir -p /zyuse/mydockerfile/tomcat8/tomcat8logs
[root@docker ~]# docker run -d -p 9080:8080 --name mytomcat -v /zyuse/mydockerfile/tomcat8/test:/usr/local/apache-tomcat-8.5.53/webapps/test -v /zyuse/mydockerfile/tomcat8/tomcat8logs:/usr/local/apache-tomcat-8.5.53/logs --privileged=true zhao/centos_test:v11.0
84304bea9769e87b0bd638f7356ce624bfafc4af3eb746e63544c8aae74738e2
[root@docker ~]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
84304bea9769        zhao/centos_test:v11.0   "/bin/sh -c '/usr/lo…"   17 seconds ago      Up 16 seconds       0.0.0.0:9080->8080/tcp   mytomcat

在這裏插入圖片描述

自定義nginx

#wget http://mirrors.sohu.com/nginx/nginx-1.17.9.tar.gz
[root@k8s-node1 docker]# cat Dockerfile
###
FROM centos
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.17.9.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.17.9 \
        && mkdir /usr/local/nginx \
        && ./configure --prefix=/usr/local/nginx \
        && make \
        && make install \
        && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
        && nginx
RUN echo "This is a test from myapp:v1.0" > /usr/local/nginx/html/index.html
RUN rm -rf /usr/src/nginx-1.17.9
EXPOSE 80

WORKDIR /
CMD nginx && tail -F /var/log/nginx/access.log
[root@k8s-node1 docker]# docker build -t reg.zhao.com/zhao/myapp:v1.0 .
[root@k8s-node1 docker]# docker run -dit -p 9999:80 --name myapp1.0 reg.zhao.com/zhao/myapp:v1.0

在這裏插入圖片描述

[root@k8s-node1 ~]# docker push reg.zhao.com/zhao/myapp:v1.0

Docker生產環境部署和實踐

Docker安裝Nginx

[root@docker ~]# docker pull nginx
[root@docker ~]# docker run --name nginx -p 8081:80 -d nginx

在這裏插入圖片描述Nginx部署

#創建目錄nginx
[root@docker ~]# mkdir -p ~/nginx/{www,logs,conf}
#拷貝容器內Nginx默認配置文件到本地當前目錄下的conf目錄
[root@docker ~]# docker cp b2c013828445:/etc/nginx/nginx.conf ~/nginx/conf/
#編輯網頁
[root@docker ~]# cat ~/nginx/www/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>星雲科技</title>
</head>
<body>
    <h1>我的夢想是</h1>
    <p>年薪28萬。</p>
</body>
</html>
#映射掛載
[root@docker ~]# docker run -d -p 8082:80 --name nginx-test-web -v ~/nginx/www/:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/log:/var/log/nginx 602e111c06b6	#鏡像ID

在這裏插入圖片描述

Docker安裝PHP

#拉取官方鏡像
[root@docker ~]# docker pull php:5.6-fpm
#啓動php
[root@docker ~]# docker run --name myphp-fpm -v ~/nginx/www:/www -d php:5.6-fpm
#修改配置
[root@docker ~]# mkdir nginx/conf/conf.d
[root@docker ~]# vim nginx/conf/conf.d/test-php.conf
server {
    listen          80;
    server_name     localhost;
    location / {
        root    /usr/share/nginx/html;
        index index.html index.htm index.php;
    }
    error_page  500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass    php:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME /www/$fastcgi_script_name;
        include         fastcgi_params;
    }
}
#啓動服務
[root@docker ~]# docker run --name runoob-php-nginx -p 8083:80 -d -v ~/nginx/www:/usr/share/nginx/html:ro -v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro --link myphp-fpm:php nginx
#-p 8083:80	端口映射,把nginx中的80映射到本地的8083端口
#~/nginx/www是本地html文件的存儲目錄,/usr/share/nginx/html是容器內html文件的存儲目錄
#~/nginx/conf/conf.d是本地nginx配置文件的存儲目錄,/etc/nginx/conf.d是容器內nginx配置文件的存儲目錄
#--link myphp-fpm:php 把myphp-fpm的網絡併入nginx,並通過修改nginx的/etc/hosts,把域名php映射成127.0.0.1,讓nginx通過php:9000訪問php-fpm 

#編輯測試頁面
[root@docker ~]# vim nginx/www/index.php
<?php
    echo phpinfo();
?>

在這裏插入圖片描述

自建私有倉庫

本地鏡像服務器

[root@dockerhub ~]# docker pull registry
[root@dockerhub ~]# docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
#--restart=always docker服務重啓時容器會隨之啓動
#--privileged=true 擴展權限
#目錄映射的目的是防止docker私有倉庫這個容器被刪除時,倉庫裏的鏡像也會被刪除
[root@docker ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"],
    "insecure-registries":["192.168.213.129:5000"]
}
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker tag hello-world 192.168.213.129:5000/hello-world:latest
[root@docker ~]# docker push 192.168.213.129:5000/hello-world:latest
The push refers to repository [192.168.213.129:5000/hello-world]
9c27e219663c: Pushed
[root@docker ~]# docker pull 192.168.213.129:5000/hello-world

在私有倉庫192.168.42.141查看上傳的鏡像

[root@dockerhub ~]# ls /registry/docker/registry/v2/repositories/
hello-world

harbor GUI

(1)給每個docker節點安裝一個ce認證信賴

[root@dockerhub ~]# vim /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "insecure-registries": ["https://hub.zhao.com"]
}
[root@dockerhub ~]# yum install lrzsz

(2)導入包

[root@dockerhub ~]# chmod a+x /usr/local/bin/docker-compose
#http://harbor.orientsoft.cn/
[root@dockerhub ~]# tar xf harbor-offline-installer-v1.2.0.tgz
[root@dockerhub ~]# mv harbor /usr/local/
[root@dockerhub ~]# cd /usr/local/harbor/
[root@dockerhub harbor]# vim harbor.cfg
hostname = hub.zhao.com
ui_url_protocol = https

(3)創建HTTPS證書

[root@docker ~]# mkdir -p /data/cert
[root@dockerhub cert]# openssl genrsa -des3 -out server.key 2048	#創建私鑰
[root@dockerhub cert]# #發起請求
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:SJZ
Organization Name (eg, company) [Default Company Ltd]:xingyun
Organizational Unit Name (eg, section) []:xingyun
Common Name (eg, your name or your server's hostname) []:hub.zhao.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@dockerhub cert]# cp server.key server.key.org	#備份私鑰
[root@dockerhub cert]# openssl rsa -in server.key.org -out server.key	#轉化證書
Enter pass phrase for server.key.org:
writing RSA key
[root@dockerhub cert]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt	#簽名
Signature ok
[root@dockerhub ~]# chmod -R 777 /data/cert

(4)執行安裝

[root@dockerhub ~]# cd /usr/local/harbor
[root@dockerhub harbor]# ./install.sh

在這裏插入圖片描述(5)在hosts中配置域名解析
(6)查看鏡像
(7)登錄訪問
推送鏡像

[root@docker ~]# docker tag hello-world hub.zhao.com/library/nginx:v1.0
[root@docker ~]# docker push hub.zhao.com/library/nginx:v1.0
The push refers to repository [hub.zhao.com/library/nginx]
9c27e219663c: Pushed
v1.0: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc04                                                                      2 size: 525

在這裏插入圖片描述拉取鏡像

[root@docker ~]# docker pull hub.zhao.com/library/nginx:v1.0
v1.0: Pulling from library/nginx
0e03bdcc26d7: Pull complete
Digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
Status: Downloaded newer image for hub.zhao.com/library/nginx:v1.0
hub.zhao.com/library/nginx:v1.0
[root@k8s-node2 ~]# docker pull reg.zhao.com/zhao/myapp:v2.0
[root@k8s-node2 ~]# docker run -dit -p 10000:80 --name myapp2.0 reg.zhao.com/zhao/myapp:v2.0

在這裏插入圖片描述harbor掛掉了

[root@docker ~]# docker stop $(docker ps -a -q)
[root@docker ~]# docker rm $(docker ps -aq)
[root@docker ~]# cd /usr/local/harbor
[root@docker harbor]# ./install.sh

docker總結

  1. docker build的執行過程是什麼?
  • Docker採用C/S架構,客戶端向服務器發送請求,服務器負責構建、運行和分發容器
  • build上下文
    docker build 命令的 PATH 或 URL 指定的路徑中的文件的集合
    解決docker客戶端和docker daemon不在同一臺機器上的情況

docker client將docker build指令發送到docker server的daemon程序,並同時拷貝build context到docker server產生JOB,由daemon解析Dockerfile,完成JOB,構建容器

  1. 什麼是多階段構建,此構建方法解決了什麼問題?

對於多階段構建,可以在Dockerfile中使用多個FROM語句,每個FROM指令可以使用不同的基礎,並且每個指令都開始一個新的構建。您可以選擇性地將工件從一個階段複製到另一個階段,從而在最終image中只留下您想要的內容。
https://docs.docker.com/develop/develop-images/multistage-build/

Docker多階段構建旨在解決編譯和構建複雜的問題,減小鏡像大小
下一步的運行可使用上一步的結果

在多階段構建中,每次 FROM 都會開啓一個新的 Stage(階段),可以看作一個新的 Image(不夠準確、來源請求),與其它階段隔離(甚至包括環境變量)。只有最後的 FROM纔會被納入 Image 中。
https://www.codercto.com/a/44975.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章