Docker入門學習筆記

風靈使發表於2018-07-25

Docker 是一個開源的應用容器引擎,而一個容器containers其實是一個虛擬化的獨立的環境,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

  • Docker 的侷限性之一,它只能用在 64 位的作業系統上。

安裝

yum install docker        # CentOS 中安裝
apt-get install docker-ce # Ubuntu 中安裝
pacman -S docker          # Arch 中安裝
emerge --ask docker       # Gentoo 中安裝

#=====================

docker version      # 通過檢視版本,檢查安裝是否成功
# Client:
#  Version:         1.12.6
#  API version:     1.24
#  Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
#  Go version:      go1.8.3
#  Git commit:      c4618fb/1.12.6
#  Built:           Thu Sep 21 22:33:52 2017
#  OS/Arch:         linux/amd64
# 
# Server:
#  Version:         1.12.6
#  API version:     1.24
#  Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
#  Go version:      go1.8.3
#  Git commit:      c4618fb/1.12.6
#  Built:           Thu Sep 21 22:33:52 2017
#  OS/Arch:         linux/amd64

命令介紹

$ docker --help

管理命令:
  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     恢復一個或多個容器內所有被暫停的程式

服務管理

service docker start       # 啟動 docker 服務,守護程式
service docker stop        # 停止 docker 服務
chkconfig docker on        # 設定為開機啟動

映象管理

映象可以看做我們平時裝系統的映象,裡面就是一個執行環境。

docker pull centos:latest  # 從docker.io中下載centos映象到本地
docker images              # 檢視已下載的映象
docker rm image_id         # 刪除映象,指定映象id

# 刪除所有映象
# none 預設為 docker.io
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)

# 連線進行進入命令列模式,exit命令退出。
docker run -t -i nginx:latest /bin/bash

通過容器建立映象

我們可以通過以下兩種方式對映象進行更改。

  1. 從已經建立的容器中更新映象,並且提交這個映象
  2. 使用 Dockerfile 指令來建立一個新的映象

下面通過已存在的容器建立一個新的映象。

docker commit -m="First Docker" -a="wcjiang" a6b0a6cfdacf wcjiang/nginx:v1.2.1

上面命令引數說明:

  • -m 提交的描述資訊
  • -a 指定映象作者
  • a6b0a6cfdacf 記住這個是容器id,不是映象id
  • wcjiang/nginx:v1.2.1 建立的目標映象名

釋出自己的映象

  1. Docker 註冊賬戶,釋出的映象都在這個頁面裡展示
  2. 將上面做的映象nginx,起個新的名字nginx-test
docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
  1. 登入docker
docker login
  1. 上傳nginx-test映象
docker push wcjiang/nginx-test:lastest
# The push refers to a repository [docker.io/wcjiang/nginx-test]
# 2f5c6a3c22e3: Mounted from wcjiang/nginx
# cf516324493c: Mounted from wcjiang/nginx
# lastest: digest: sha256:73ae804b2c60327d1269aa387cf782f664bc91da3180d10dbd49027d7adaa789 size: 736

映象中安裝軟體

通常情況下,使用docker官方映象,如 mysql映象,預設情況下映象中啥軟體也沒有,通過下面命令安裝你所需要的軟體:

# 第一次需要執行這個命令,確保源的索引是最新的
# 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
apt-get update
# 做過上面更新同步之後,可以執行下面的命令了
apt-get install vim

如果你安裝了CentOS或者Ubuntu系統可以進入系統安裝相關軟體

# 進入到centos7映象系統
docker run -i -t centos:7 /bin/bash
yum update
yum install vim

容器管理

容器就像一個類的例項

docker run centos echo "hello world"  # 在docker容器中執行hello world!
docker run centos yum install -y wget # 在docker容器中,安裝wget軟體
docker ps                           # 列出包括未執行的容器
docker ps -a                        # 檢視所有容器(包括正在執行和已停止的)
docker logs my-nginx                # 檢視 my-nginx 容器日誌

docker run -i -t centos /bin/bash   # 啟動一個容器
docker inspect centos     # 檢查執行中的映象
docker commit 8bd centos  # 儲存對容器的修改
docker commit -m "n changed" my-nginx my-nginx-image # 使用已經存在的容器建立一個映象
docker inspect -f {{.State.Pid}} 44fc0f0582d9 # 獲取id為 44fc0f0582d9 的PID程式編號

容器服務管理

docker run -itd --name my-nginx2 nginx # 通過nginx映象,【建立】容器名為 my-nginx2 的容器
docker start my-nginx --restart=always    # 【啟動策略】一個已經存在的容器啟動新增策略
                               # no - 容器不重啟
                               # on-failure - 容器推出狀態非0時重啟
                               # always - 始終重啟
docker start my-nginx               # 【啟動】一個已經存在的容器
docker restart my-nginx             # 【重啟】容器
docker stop my-nginx                # 【停止執行】一個容器
docker kill my-nginx                # 【殺死】一個執行中的容器
docker rename my-nginx new-nginx    # 【重新命名】容器
docker rm new-nginx                 # 【刪除】容器

進入容器

  1. 建立一個守護狀態的Docker容器
docker run -itd my-nginx /bin/bash
  1. 使用docker ps檢視到該容器資訊
docker ps
# CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# 6bd0496da64f        nginx               "/bin/bash"         20 seconds ago      Up 18 seconds       80/tcp              high_shirley
  1. 使用docker exec命令進入一個已經在執行的容器
docker exec -it 6bd0496da64f /bin/bash

通常有下面幾種方式進入Docker的容器,推薦使用exec,使用attach一直進入失敗。

使用Docker實戰

部署Nginx

1.在 docker hub 中查詢 nginx 相關映象。

$ docker search nginx

# INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# docker.io   docker.io/nginx                                                  Official build of Nginx.                        7006      [OK]
# docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1137                 [OK]
# docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   453                  [OK]
# docker.io   docker.io/jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as...   230                  [OK]
# docker.io   docker.io/kong                                                   Open-source Microservice & API Management ...   116       [OK]
# docker.io   docker.io/webdevops/php-nginx                                    Nginx with PHP-FPM                              90                   [OK]

2.拉取官方映象,其中上面的非官方映象是使用者們根據自己的需要製作的映象,方便大家的使用。

$ docker pull nginx
# Using default tag: latest
# Trying to pull repository docker.io/library/nginx ...
# latest: Pulling from docker.io/library/nginx
# bc95e04b23c0: Pull complete
# 110767c6efff: Pull complete
# f081e0c4df75: Pull complete
# Digest: sha256:004ac1d5e791e705f12a1

3.利用這個映象啟動一個新的容器

docker run --name my-nginx -d -p 8080:80 nginx
# faaed6a2d63af248961aab59713e515c76aea447

4.檢視容器執行日誌

docker logs my-nginx

啟動一個更復雜Nginx的例子:

# 上面的命令將本地檔案中的 nginx.conf 配置檔案掛載到容器,並且將要展示的靜態頁面也掛載到容器。
docker run --name my-nginx \ 
    -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v /some/html:/usr/share/nginx/html:ro \
    -p 8080:80 \
    -d nginx

-v 引數語法為 -v host dir:container dir[:ro|rw]

  • –name 為容器取一個名字
  • -p 引數語法為 -p host port:container port; -p 8080:80 將主機上的8080埠繫結到容器上的80埠,因此在主機中訪問8080埠時其實就是訪問 nginx 容器的80埠
  • -d 後臺執行容器

部署MySQL

拉取官方的映象,標籤為5.7Docker官方資料MySQL 官方資料

docker pull mysql:5.7
# Trying to pull repository docker.io/library/mysql ...
# 5.7: Pulling from docker.io/library/mysql
# 85b1f47fba49: Already exists
# f34057997f40: Pull complete
# ....
# Digest: sha256:bfb22e93ee87c6aab6c1c9a4e70f28fa289f9ffae9fe8e173

建立目錄

  • data目錄將對映為mysql容器配置的資料檔案存放路徑
  • logs目錄將對映為mysql容器的日誌目錄
  • conf目錄裡的配置檔案將對映為mysql容器的配置檔案
mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf

執行容器

docker run --name my-mysql \ 
-p 3306:3306 \ 
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf \ 
-v $PWD/logs:/logs \ 
-v $PWD/data:/mysql_data \ 
-e MYSQL_ROOT_PASSWORD=123456 \ 
-d mysql:5.7
  • -p 3306:3306:將容器的3306埠對映到主機的3306埠
  • -v $PWD/conf/my.cnf:/etc/mysql/my.cnf:將主機當前目錄下的conf/my.cnf掛載到容器的/etc/mysql/my.cnf
  • -v $PWD/logs:/logs:將主機當前目錄下的logs目錄掛載到容器的/logs
  • -v $PWD/data:/mysql_data:將主機當前目錄下的data目錄掛載到容器的/mysql_data
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root使用者的密碼

Docker私有倉庫搭建

通過官方提供的私有倉庫映象registry來搭建私有倉庫。通過 humpback 快速搭建輕量級的Docker容器雲管理平臺。

部署registry

docker pull registry:2.6.2

為了定製一些配置,和在 humpback 中使用,我們還需要提供一個定製化的配置檔案(使用yml來編寫配置檔案),檔案放在/etc/docker/registry/config.yml,如下:

version: 0.1
log:
  fields:
    service: registry
storage: 
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :7000
  secret: docker-registry
  headers:
    X-Content-Type-Options: [nosniff]
    Access-Control-Allow-Headers: ['*']
    Access-Control-Allow-Origin: ['*']
    Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE']
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

建立容器並執行,建立成功之後,可訪問 http://192.168.99.100:7000/v2/,來檢查倉庫是否正常執行,當返回 {} 時,表示部署成功。

docker run -d -p 7000:7000 --restart=always \
 -v /var/lib/registry/:/var/lib/registry/ \
 -v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml \
 --name humpback-registry \
 registry:2.6.2

推送映象到私有倉庫

# 從官方倉庫拉取一個映象
docker pull nginx:1.13
# 為映象 `nginx:1.13` 建立一個新標籤 `192.168.99.100:7000/test-nginx:1.13`
docker tag nginx:1.13 192.168.99.100:7000/test-nginx:1.13
# 推送到私有倉庫中
docker push 192.168.99.100:7000/test-nginx:1.13
# The push refers to a repository [192.168.99.100:7000/test-nginx]
# Get https://192.168.99.100:7000/v1/_ping: http: server gave HTTP response to HTTPS client

在推送到的時候報錯誤,預設是使用https提交,這個搭建的預設使用的是 http,解決方法兩個:

  1. 建立一個https對映
  2. 將倉庫地址加入到不安全的倉庫列表中

我們使用第二種方法,加入到不安全的倉庫列表中,修改docker配置檔案vi /etc/docker/daemon.json 新增 insecure-registries配置資訊。

{
  //... 其他配置項
  //關鍵配置項,將倉庫將入到不安全的倉庫列表中
  "insecure-registries":[ 
    "192.168.99.100:7000"
  ]
}

重啟服務 service docker restart,預設情況下 push 是會報如下錯誤的:

docker push 192.168.99.100:7000/test-nginx:1.13
# The push refers to a repository [192.168.99.100:7000/test-nginx]
# a1a53f8d99b5: Retrying in 1 second
# ...
# received unexpected HTTP status: 500 Internal Server Error

上面錯誤是SELinux強制訪問控制安全系統,阻止導致的錯誤,通過下面方法禁用SELinux之後就可以push了。

setenforce 0  
getenforce   
# Permissive  

部署Humpback

首先建立放持久化資料資料夾,mkdir -p /opt/app/humpback-web,裡面存放持久化資料檔案,會儲存站點管理和分組資訊,啟動後請妥善儲存。

# 建立放持久化資料資料夾
mkdir -p /opt/app/humpback-web
# 下載humpback-web映象到本地
docker pull humpbacks/humpback-web:1.0.0
# 啟動 humpback-web 容器,將容器命名為 humpback-web
docker run -d --net=host --restart=always \
 -e HUMPBACK_LISTEN_PORT=7001 \
 -v /opt/app/humpback-web/dbFiles:/humpback-web/dbFiles \
 --name humpback-web \
 humpbacks/humpback-web:1.0.0

訪問站點,開啟瀏覽器輸入:http://192.168.99.100:7001 ,預設賬戶:admin 密碼:123456

參考資料

官方英文資源

中文資源

其它資源

相關文章