Docker C/S結構python
Docker是C/S(客戶端client-服務器server)架構模式。
docker經過客戶端鏈接守護進程,經過命令向守護進程發出請求,守護進程經過一系列的操做返回結果。
docker客戶端能夠鏈接本地或者遠程的守護進程。linux
Docker Image鏡像nginx
鏡像是容器的基石,容器基於鏡像啓動和運行。鏡像就好像容器的源代碼,保存了容器各類啓動的條件。鏡像是一個層疊的只讀文件系統。web
Docker container容器docker
容器經過鏡像來啓動,容器是docker的執行來源,能夠執行一個或多個進程。鏡像至關於構建和打包階段,容器至關於啓動和執行階段。容器啓動時,Docker容器能夠運行、開始、中止、移動和刪除。每個Docker容器都是獨立和安全的應用平臺。數據庫
要注意的是,因爲容器是基於鏡像的,因此無論對容器怎樣的操做,一旦容器重啓,一切都會變成最開始的樣子。json
Docker registry 倉庫vim
docker倉庫用來保存鏡像。docker倉庫分爲公有和私有。docker公司提供公有倉庫docker hub,網址:https://hub.docker.com/。咱們也能夠建立本身私有的倉庫。centos
# 1.配置源 curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 2.下載docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum list docker-ce.x86_64 --showduplicates | sort -r yum install -y --setopt=obsoletes=0 \ docker-ce-17.03.2.ce-1.el7.centos.x86_64 \ docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch # 3.啓動docker systemctl daemon-reload systemctl restart docker systemctl enable docker
# 優化鏡像的安裝 mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"] } EOF
# 1.獲取鏡像 # 查詢遠程倉庫中的centos docker search centos # 下載鏡像(服務、系統) docker pull centos:6.9 docker pull centos:7.5.1804 docker pull nginx # 2.查詢鏡像 # 查詢擁有的鏡像 docker images # 顯示所擁有的鏡像的ID docker images -q # 經過鏡像ID或者鏡像名加標籤查詢鏡像,並顯示詳細信息 docker inspect ID/name:tag # 3.刪除鏡像 # 根據ID刪除鏡像 docker rmi ID # 查詢全部鏡像ID並刪除 docker rmi `docker images -q` docker rmi $(docker images -q) # 4.導入導出鏡像 # 導出 docker image save nginx >/opt/nginx.tar.gz # 導入 docker image load -i /opt/nginx.tar.gz # 5.啓動容器並獲取鏡像 docker run -d -p 80:80 httpd docker run -it --name "test" centos:6.9 # -d: 後臺運行容器,並返回容器ID; # -p: 端口映射,格式爲:主機(宿主)端口:容器端口; # -i: 以交互模式運行容器,一般與 -t 同時使用; # -t: 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用; # --name="nginx-lb": 爲容器指定一個名稱; # httpd/centos6.9:能夠根據鏡像名或鏡像ID來啓動鏡像
docker commit xxxxxx oldguo/wordpress:v1 # xxxxxx:擁有的鏡像名/鏡像ID # oldguo/wordpress:製做的鏡像名 # v1:製做的鏡像標籤 # 爲什麼要製做鏡像 # 好比我對centos7.5添加了一些軟件,而後不想每次都啓動原始的centos7.5,都要再添加一次軟件,因此,能夠把添加軟件後的centos7.5製做成一個鏡像,而後啓動這個鏡像就行
# 1.啓動新容器 docker run -it --name "centos7.5" 76d6bc25b8a5 # 2.優化yum源 mv /etc/yum.repos.d/*.repo /tmpecho -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo # 3. 安裝必須軟件包 yum install -y vim net-tools iproute openssh-* -y # 4.啓動SSHD mkdir /var/run/sshd echo 'UseDNS no' >> /etc/ssh/sshd_config sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd echo 'root:123456' | chpasswd # 分配公鑰 /usr/bin/ssh-keygen -A /usr/sbin/sshd -D # 注意: 以上操做作完以後,會一直不退出,須要用如下命令退回到宿主機,並不關閉容器 ctrl+p+q # 5.製做鏡像,以便往後使用 docker commit centos7.5 oldguo/centos7_sshd:v2
# dockerfile 能夠快速建立一個鏡像 # 咱們就使用dockerfile來快速建立一個centos7.5+vim+net-tools+iproute+sshd的鏡像 # 1.建立一個dockerfile文件 vim dockerfile # 2.輸入內容 FROM centos:7.5.1804 RUN mv /etc/yum.repos.d/*.repo /tmp RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo RUN yum install -y openssh-server RUN yum install -y openssh-clients RUN yum install net-tools* -y RUN yum install iproute-* -y RUN mkdir /var/run/sshd RUN echo 'UseDNS no' >> /etc/ssh/sshd_config RUN sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd RUN echo 'root:123456' | chpasswd RUN /usr/bin/ssh-keygen -A EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] # 3.執行dockerfile文件 docker build -t "oldguo/centos7_sshd:v3" /opt/dockerfile # docker build 命令用於使用 Dockerfile 建立鏡像。 # 使用時要指定dockerfile文件所在的目錄,若不指定,就會從當前目錄裏找
按用途容器大體能夠分爲兩類:服務類容器和工具類容器安全
# 1. 服務類容器以daemon的形式運行,對外提供服務。好比web server,數據庫等。經過-d參數以守護方式啓動這類容器很是合適。若是須要排查問題,能夠經過exec -it進入容器 # 工具類:vim docker run -it --name="test_vim" 3fe2fe0dab2e /bin/bash # 2. 工具類容器一般給咱們提供一個臨時的工做環境,一般以run -it方式運行 # 服務類:nginx # -d:後臺運行 docker run -d -p 8080:80 --name="discuz" nginx:1.14
①啓動進入容器指定bash 退出後容器關閉
docker run -it --name "test" centos:7.5.1804 /bin/bash # 1.使用-it+/bin/bash執行後,會在容器後臺啓動一個bash進程,顯示該容器的終端 # /bin/bash的做用是由於docker後臺必須運行一個進程,不然容器就會退出 # 2.使用/bin/bash啓動鏡像的時候若是沒有帶參數 -it的話,容器會直接退出 # 3.使用-it執行後,容器從新分配一個僞輸入終端,容器不會當即退出,直到exit容器才關閉 # 注: # 針對於工具類的容器,因爲是一次性使用的,一旦exit容器,容器就自動關閉。 # 對於想要退出後還能夠在後臺執行的,好比服務類,可使用Ctrl+p+q。
②docker attach進入容器
# 若是容器沒有指定bash環境會停留在空白頁面 退出後容器也會正常退出(進入容器後其餘人進入容器能夠看到你輸入的信息 docker attach test # attach進入的容器應當是已經啓動的容器,當有多臺主機經過attach進入同一臺容器時,全部的操做都是多臺主機同時可見的,當退出時也是同時退出 # 也能夠理解爲,attach是對一臺容器開了多個終端操做,當其中一臺終端操做時,會反映到全部的終端上
③docker exec 進入容器 會啓用一個bash環境
# exec也是進入一個已經開啓的容器中,可是會新啓用一個bash環境,不會像attach同樣同步到每一個終端 docker exec -it test /bin/bash
# 查看容器 # -a:顯示全部的容器,包括未運行的。 # -q:只顯示容器編號 # -l:顯示最近建立的容器。 docker ps -a -q -l # 查看容器中運行的進程信息 docker top nginx # 刪除一個或多少容器 # -f:經過SIGKILL信號強制刪除一個運行中的容器 # -l:移除容器間的網絡鏈接,而非容器自己 # -v:刪除與容器關聯的卷 docker rm 容器ID|容器名稱 # 批量刪除已關閉 docker rm -v $(docker ps -aq -f status=exited) # 批量強制刪除全部 docker rm -f `docker ps -a –q` # 獲取容器/鏡像的元數據,包括IP等 docker inspect nginx # 鏈接到正在運行中的容器。 docker attach 容器ID|容器名稱(工具類)配合ctrl+p+q docker exec -i -t 容器ID|容器名稱 /bin/bash(服務類),通常是作服務類容器調試用 # 中止一個運行中的容器 docker stop 容器ID|容器名稱 # 殺掉一個運行中的容器。 docker kill 容器ID|容器名稱 # 啓動一個或多個已經被中止的容器 docker start 容器ID|容器名稱 # 重啓容器 docker restart 容器ID|容器名稱
在Docker的使用過程當中每每須要對數據進行持久化,或者須要在多個容器之間進行數據共享,因此這就涉及到Docker容器的數據操做。 容器中數據管理主要有兩種方式:
數據卷和數據卷容器
# 啓動時指定: docker run -it --name="centosv1" -v /opt/datavolumns:/data centos /bin/bash # Dockerfile中指定 VOLUMES [「/data」] docker inspect centosv1
# 備份 docker run --volumes-from centosv1 --name 「centosvbak「 --rm -v /backup:/backup:rw centos tar cvf /backup/data.tar /data # 恢復 docker run --volumes-from centosv1 --name "centosrestore" --rm -v /backup:/backup:rw centos tar xvf /backup/data.tar
# 1. docker run -d -p 5000:5000 --restart=always --name registry -v /opt/Registry:/var/lib/registry registry # 2.配置 vim /etc/docker/daemon.json { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"], "insecure-registries": ["10.0.0.100:5000"] } # 3.重啓docker systemctl restart docker
# 配置好私有倉庫,咱們就能夠把製做好的鏡像放到本地的私有倉庫,方便下載使用 # 1.製做本地鏡像並push到私有倉庫 # 爲本地鏡像nginx打上標籤 # IP地址加上私有倉庫的端口號(10.0.0.100:5000/)是必須的,後面的名字就隨意了 docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1 docker push 10.0.0.100:5000/oldguo/nginx:v1 # 2.異地進行pull鏡像,從本地的私有倉庫下載鏡像 docker pull 10.0.0.100:5000/oldguo/nginx:v1