1. 程式人生 > >Docker基本操作(容器管理、建立映象)

Docker基本操作(容器管理、建立映象)

什麼是Docker 映象?

Docker 映象就是一個只讀的模板。
例如:一個映象可以包含一個完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它應用程式。映象可以用來建立 Docker 容器。
Docker 提供了一個很簡單的機制來建立映象或者更新現有的映象,使用者甚至可以直接從其他人那裡下載一個已經做好的映象來直接使用。
容器是從映象建立的執行例項。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式。

什麼是Docker 容器?

Docker 利用容器來執行應用。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式。


安裝 Docker 引擎

1.在阿里雲註冊賬號 進入阿里雲 https://www.aliyun.com/ 登陸後,進入【管理中心】

2.安裝 docker 引擎 如果是安裝最新版本 docker:
【管理中心】 –> Docker映象倉庫 –> 加速器 –> centos

如果需要安裝 docker 歷史版本:
Docker Engine映象源站

搭建docker環境

[root@foundation40 ~]# yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@foundation40 ~]# systemctl start docker
[root@foundation40 ~]# docker info    # docker宿主機的資訊

映象的匯入和容器的使用

1.將game2048這個映象載入

get game2048.tar 
[[email protected] ~]# docker load -i game2048.tar   #安裝映象

2.執行docker

[[email protected] ~]# docker run -d --name westos game2048    #-d打入後臺 --name表示為這個容器起的名字是westos
    22b11e9b1094a64c4ab4fcf9c02aa40113c64a89b601872efd338b015489697b

3.檢視容器列表

[root@foundation40 ~]# docker ps -a   #檢視容器列表
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
22b11e9b1094        game2048            "/bin/sh -c 'sed -..."   About a minute ago   Up About a minute   80/tcp, 443/tcp     westos
[root@foundation40 ~]# ip addr

在安裝好docker後,linux系統會為docker容器分配一個ip,利用ip addr中檢視docker0的ip
這裡寫圖片描述
4.檢視westos容器的ip

[root@foundation40 ~]# docker inspect westos   #檢視westos容器的ip

這裡寫圖片描述

5.在本機瀏覽器中輸入該ip,訪問該容器網址(這個172.17.0.2是自己私有的ip地址,別人不能訪問)
這裡寫圖片描述


Docker常用命令

管理命令:
  container   管理容器
  image       管理映象
  network     管理網路
命令:
  attach      介入到一個正在執行的容器
  build       根據 Dockerfile 構建一個映象
  commit      根據容器的更改建立一個新的映象
  cp          在本地檔案系統與容器中複製 檔案/資料夾
  create      建立一個新容器
  exec        在容器中執行一條命令
  images      列出映象
  kill        殺死一個或多個正在執行的容器    
  logs        取得容器的日誌
  pause       暫停一個或多個容器的所有程序
  ps          列出所有容器
  pull        拉取一個映象或倉庫到 registry
  push        推送一個映象或倉庫到 registry
  rename      重新命名一個容器
  restart     重新啟動一個或多個容器
  rm          刪除一個或多個容器
  rmi         刪除一個或多個映象
  run         在一個新的容器中執行一條命令
  search      在 Docker Hub 中搜索映象
  start       啟動一個或多個已經停止執行的容器
  stats       顯示一個容器的實時資源佔用
  stop        停止一個或多個正在執行的容器
  tag         為映象建立一個新的標籤
  top         顯示一個容器內的所有程序
  unpause     恢復一個或多個容器內所有被暫停的程序

拉取網路映象

1.編寫映象加速的檔案

[root@foundation40 ~]# cd /etc/docker/
[root@foundation40 docker]# vim daemon.json 
{
  "registry-mirrors": ["https://iklzfcq9.mirror.aliyuncs.com"]
}           # 阿里雲中映象加速的屬於你的ip

2.重啟服務

[root@foundation40 docker]# systemctl daemon-reload
[root@foundation40 docker]# systemctl restart docker

3.拉取nginx映象

[root@foundation40 ~]# cd /etc/docker/
[root@foundation40 docker]# docker pull nginx
[root@foundation40 docker]# docker load -i nginx.tar  #從tar歸檔檔案讀取映象
[root@foundation40 docker]# docker run -d --name vm2 nginx
[root@foundation40 docker]# docker inspect vm2  #檢視私有 vm2的映象IP

這裡寫圖片描述
4.網頁訪問http://172.17.0.2/可以看到nginx網頁
這裡寫圖片描述
5.向容器中的nginx服務傳送html釋出主頁
第一種方法:

[root@foundation40 ~]# vim index.html    # 編輯nginx服務的首頁
www.westos.org
[root@foundation40 ~]# docker cp index.html vm2:/usr/share/nginx/html    # 遠端拷貝首頁到映象nginx的釋出目錄中

網頁訪問http://172.17.0.2/ 可以看到自己編寫的網頁
這裡寫圖片描述

第二種方法:在物理主機開啟容器時-v掛載
建立web容器的釋出檔案,把釋出檔案複製到web容器

[root@foundation40 ~]# vim index.html
<h1>www.westos.org</h1>
[root@foundation40 ~]# cd /tmp
[root@foundation40 tmp]# mkdir docker
[root@foundation40 tmp]# cd docker/
[root@foundation40 docker]# mkdir web
[root@foundation40 docker]# cd
[root@foundation40 ~]# mv index.html /tmp/docker/web/
[root@foundation40 ~]# docker rm -f vm2   # 刪除上邊已經命名的vm2
[root@foundation40 ~]# docker run -d --name vm2 -v /tmp/docker/web:/usr/share/nginx/html nginx   # 在本地匯入nginx的預設釋出目錄
-v表示把宿主機的目錄掛載到容器中

這裡寫圖片描述

網頁訪問http://172.17.0.2/可以看到自己寫的釋出目錄
這裡寫圖片描述


資料卷管理

docker run 在建立容器時使用 -v 引數可以掛載一個或多個數據捲到當前執行的容器中,-v的作用是將宿主機上的目錄作為容器的資料卷掛載到容器中,使宿主機和容器之間可以共享一個目錄。可以重複使用,掛載多個數據捲到容器中,冒號前面的是宿主機的目錄(本地目錄不存在 docker 會自動建立),冒號後面的是容器中的掛載目錄。

在平臺獲取 rhel7.tar
[root@foundation40 ~]# docker load -i rhel7.tar 

1.掛載資料捲到新建立的容器上

[root@foundation40 ~]# docker rm -f  vm2
[root@foundation40 ~]# cd /tmp
[root@foundation40 tmp]# mkdir data1
[root@foundation40 tmp]# mkdir data2
[root@foundation40 tmp]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 /bin/bash

bash-4.2# cd /data2
bash-4.2# touch file
bash-4.2# cd /data1
bash-4.2# touch file 
bash-4.2# ls
退出時按ctrl+pq 是退出容器不停止執行
ctrl+d 是退出容器並停止執行

這裡寫圖片描述
這裡寫圖片描述
2.測試在data1目錄裡是可寫的

[root@foundation40 tmp]# cd data1
[root@foundation40 data1]# ls
file
[root@foundation40 data1]# touch file1
[root@foundation40 data1]# ls
file  file1

3.掛載宿主機檔案

[root@foundation40 data1]# cd ..
[root@foundation40 tmp]# cd data2
[root@foundation40 data2]# docker create  --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro 

4.資料卷容器

[root@foundation40 data2]# docker run -it --name vm1 --volumes-from datavol rhel7 bash
[root@foundation40 data2]# docker run -it --name vm2 -v /tmp/backup:/backup rhel7 bash

5.備份資料卷

[root@foundation40 backup]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc

6.在data1的目錄裡是可讀可寫的

[root@foundation40 ~]# docker run -it --name vm1 -v /data1 ubuntu
root@50b7cb834d07:/# cd /data1
root@50b7cb834d07:/data1# [root@foundation40 ~]# 
[root@foundation40 ~]# docker inspect vm1 |grep vol
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/d8910f48c4bae02e1cbe0e5bc1c4725a9ee3785df66a1d7a55f4083089463769/_data",
[root@foundation40 ~]# cd /var/lib/docker/volumes/d8910f48c4bae02e1cbe0e5bc1c4725a9ee3785df66a1d7a55f4083089463769/_data
[root@foundation40 _data]# ls
[root@foundation40 _data]# cp /etc/passwd .
[root@foundation40 _data]# ls
passwd
[root@foundation40 _data]# pwd

這裡寫圖片描述
測試

[root@foundation40 ~]# docker container attach vm1
root@50b7cb834d07:/data1# 
root@50b7cb834d07:/data1# ls
passwd
[root@foundation40 ~]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
ed53537b6569462e6b0800834b67fa063e8d1a8d511c750f37798c7ab2e3bd57
[root@foundation40 ~]# docker ps
[root@foundation40 ~]# docker inspect vm2 |grep vol
root@foundation40 ~]# cd /var/lib/docker/volumes/25f2dbe141506c2d56995bce2c2c282ca991b3c3e5b78752c2e8890ca8bb797f/_data
[root@foundation40 _data]# ls
50x.html  index.html

這裡寫圖片描述

刪除獨立卷

[root@foundation40 ~]# docker stop vm2
[root@foundation40 ~]# docker rm -f vm2
[root@foundation40 ~]# docker volume rm 25f2dbe141506c2d56995bce2c2c282ca991b3c3e5b78752c2e8890ca8bb797f
[root@foundation40 ~]# cd -     #刪除後就cd不到目錄下
[root@foundation40 ~]# docker volume ls   #檢視是否還有卷未刪除
[root@foundation40 ~]# docker volume rm `docker volume ls -q`   #刪除全部

網路管理

獲取容器的PID

[root@foundation40 backup]# cd /proc/
[root@foundation40 proc]# docker start vm1
[root@foundation40 proc]# docker inspect vm1 |grep Pid

這裡寫圖片描述

[root@foundation40 proc]# cd 13999/
[root@foundation40 13999]# cd net
[root@foundation40 net]# cd ..
[root@foundation40 13999]# cd ns/
[root@foundation40 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation40 ns]# cd /etc/docker
[root@foundation40 docker]# docker ps
[root@foundation40 docker]# brctl show

這裡寫圖片描述

[root@foundation40 docker]# docker stop vm1
[root@foundation40 docker]# brctl show

這裡寫圖片描述

[root@foundation40 docker]# docker start vm1
[root@foundation40 docker]# docker start vm2
[root@foundation40 docker]# brctl show

這裡寫圖片描述

host模式

host模式:使用docker run時使用–net=host指定,docker使用的網路實際上和宿主機一樣,在容器內看到的網絡卡ip是宿主機上的ip。host模式很好的解決了容器與外界通訊的地址轉換問題,可以直接使用宿主機的IP映象通訊。但是也降低了隔離性,同時還會引起網路資源的競爭和衝突。

[root@foundation40 docker]# docker run -it --name  vm3 ubuntu
[root@foundation40 docker]# docker rm -f vm3
[root@foundation40 docker]# docker run -it --name vm3 --net host ubuntu
root@foundation40:/# ip addr

這裡寫圖片描述

container複用方式

container模式:多個容器使用共同的網路,看到的ip是一樣的。container模式的應用場景就在於可以將一個應用的多個元件放在不同的容器中,這些容器配成container模式的網路,這樣它們就可以作為一個整體對外提供服務。同樣這種模式也降低了容器間的隔離性。

[root@foundation40 docker]# docker run -it --name  vm4 ubuntu
[root@foundation40 ~]# docker rm -f vm4
[root@foundation40 ~]# docker run -it --name vm4 --net container:vm2 ubuntu
root@e7286e084886:/# ip addr

這裡寫圖片描述

none方式

none模式:使用–net=none指定:這種模式下不會配置任何網路,它給了使用者最大的自由度來自定義容器的網路環境。

[root@foundation40 ~]# docker run -it --name vm5 --net none ubuntu
root@a78003cd794e:/# ip addr

這裡寫圖片描述

重新開一個shell視窗:自己指定設定網路

[root@foundation40 ~]# docker inspect vm5 |grep Pid
            "Pid": 16564,
            "PidMode": "",
            "PidsLimit": 0,
[root@foundation40 ~]# cd /proc/16564
[root@foundation40 16564]# cd ns/
[root@foundation40 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation40 ns]# ll

這裡寫圖片描述

[root@foundation40 ns]# ip netns add test
[root@foundation40 ns]# ip netns list
test
[root@foundation40 ns]# cd /var/run/
[root@foundation40 run]# cd netns/
[root@foundation40 netns]# ls
test
[root@foundation40 netns]# ip netns del test
[root@foundation40 netns]# ls
[root@foundation40 netns]# ln -s /proc/16564/ns/net /var/run/netns/16564
[root@foundation40 netns]# ip netns list
16564
[root@foundation40 netns]# ip link add name veth0 type veth peer name veth1
[root@foundation40 netns]# ip addr

這裡寫圖片描述

[root@foundation40 netns]# brctl show
[root@foundation40 netns]# brctl addif docker0 veth0
[root@foundation40 netns]# brctl show

這裡寫圖片描述

[root@foundation40 netns]# ip link set up veth0
[root@foundation40 netns]# ip link set up veth1
[root@foundation40 netns]# ip addr

這裡寫圖片描述

[root@foundation40 netns]# ip link set veth1 netns 16564
[root@foundation40 netns]# ip netns exec 16564 ip link set veth1 name eth0
[root@foundation40 netns]# ip netns exec 16564 ip link set up dev eth0
[root@foundation40 netns]# ip netns exec 16564 ip link set up dev eth1
Cannot find device "eth1"
[root@foundation40 netns]# ip netns exec 16564 ip addr add 172.17.0.100/24 dev eth0
[root@foundation40 netns]# ip netns exec 16564 ip route add default via 172.17.0.1    ##新增閘道器

返回之前的shell視窗

root@a78003cd794e:/# ping 172.17.0.1
root@a78003cd794e:/# ping baidu.com
root@a78003cd794e:/# route -n

使用Dockerfile建立映象

建立apach釋出目錄的映象

1.編寫Dockerfile檔案

[[email protected] ~]# vim /tmp/docker/Dockerfile
FROM rhel7      # 源映象是rhel7
ENV HOSTNAME server1    # 定義hostname為server1
MAINTAINER 229683481@qq.com    # 定義郵箱
EXPOSE 80     # 定義埠為80
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all  
# 執行命令安裝httpd並清除yum快取
# rpmdb 命令用於初始化和重建rpm資料庫
VOLUME ["/var/www/html"]     # 資料卷所在的位置
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]    # 開啟apach服務

2.封裝映象

[root@foundation40 ~]# cd /tmp/docker/
[root@foundation40 ~]# docker build -t rhel7:v1 .

這裡寫圖片描述
3.檢視封裝的映象

[root@foundation40 docker]# docker images rhel7

這裡寫圖片描述

封裝ssh服務

可以連線別的主機也可以被別人連線
1.編輯Dockerfile檔案

[[email protected] docker]# mkdir ssh
[[email protected] docker]# mkdir ssh
[[email protected] ssh]# vim Dockerfile 
FROM rhel7
ENV HOSTNAME server2
MAINTAINER 229683481@qq.com
EXPOSE 22            # 對外埠是22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server && yum install -y openssh-clients yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]     #映象啟動命令,預設只能啟動一條

這裡寫圖片描述
2.開始封裝映象

[root@foundation40 ssh]# docker build -t rhel7:v2 .

這裡寫圖片描述
3.測試能否連線

[root@foundation40 ssh]# docker run -it --name vm0 rhel7:v2
[root@foundation40 ssh]# docker inspect vm0   #檢視私有地址
             "IPAddress": "172.17.0.3",
[root@foundation40 ssh]# ssh [email protected]

這裡寫圖片描述

利用supervisord一次封裝多個服務

1.編輯Dockerfile檔案(使httpd和ssh結合)

[[email protected] /]# docker rm -f `docker ps -aq`
[[email protected] /]# cd /tmp/docker/
[[email protected] docker]# ls
[[email protected] docker]# vim Dockerfile 
FROM rhel7
EXPOSE 80 22
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-clients supervisor && yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:westos | chpasswd
CMD ["/usr/bin/supervisord"]

這裡寫圖片描述
2.修改yum檔案

[[email protected] docker]# vim yum.repo 
[source7.3]
name=source7.3
baseurl=http://172.25.40.250/source7.3
gpgcheck=0

[docker]
name=docker
baseurl=http://172.25.254.250/pub/docker
gpgcheck=0

3.編輯supervisord.conf檔案

[[email protected] docker]# vim supervisord.conf
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:httpd]
command=/usr/sbin/httpd

4. 開始封裝映象

[root@foundation40 docker]# docker build -t rhel7:v3 .

這裡寫圖片描述
5.用封裝的映象建立容器

[root@foundation40 docker]# docker run -d --name vm1 -v /tmp/docker/web:/var/www/html rhel7:v3
[root@foundation40 docker]# docker ps

這裡寫圖片描述
6.測試同時具有httpd和sshd服務的容器

[root@foundation40 docker]# docker inspect vm1

這裡寫圖片描述

測試:

[root@foundation40 docker]# curl 172.17.0.2   #可以看到網頁內容
[root@foundation40 docker]# ssh -l root 172.17.0.2   #可以連線

這裡寫圖片描述
這裡寫圖片描述