Docker入門學習筆記
Docker
是一個開源的應用容器引擎,而一個容器其實是一個虛擬化的獨立的環境,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 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
通過容器建立映象
我們可以通過以下兩種方式對映象進行更改。
- 從已經建立的容器中更新映象,並且提交這個映象
- 使用 Dockerfile 指令來建立一個新的映象
下面通過已存在的容器建立一個新的映象。
docker commit -m="First Docker" -a="wcjiang" a6b0a6cfdacf wcjiang/nginx:v1.2.1
上面命令引數說明:
-m
提交的描述資訊-a
指定映象作者a6b0a6cfdacf
記住這個是容器id,不是映象idwcjiang/nginx:v1.2.1
建立的目標映象名
釋出自己的映象
docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
- 登入docker
docker login
- 上傳
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 # 【刪除】容器
進入容器
- 建立一個守護狀態的Docker容器
docker run -itd my-nginx /bin/bash
- 使用
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
- 使用
docker exec
命令進入一個已經在執行的容器
docker exec -it 6bd0496da64f /bin/bash
通常有下面幾種方式進入Docker的容器,推薦使用exec
,使用attach
一直進入失敗。
- 使用
docker attach
- 使用
SSH
為什麼不需要在 Docker 容器中執行 sshd - 使用
nsenter
進入Docker容器,nsenter官方倉庫 - 使用
docker exec
,在1.3.*
之後提供了一個新的命令exec
用於進入容器
使用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.7
,Docker官方資料、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
,解決方法兩個:
- 建立一個https對映
- 將倉庫地址加入到不安全的倉庫列表中
我們使用第二種方法,加入到不安全的倉庫列表中,修改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
參考資料
官方英文資源
- Docker官網:http://www.docker.com
- Docker windows入門:https://docs.docker.com/windows/
- Docker Linux 入門:https://docs.docker.com/linux/
- Docker mac 入門:https://docs.docker.com/mac/
- Docker 使用者指引:https://docs.docker.com/engine/userguide/
- Docker 官方部落格:http://blog.docker.com/
- Docker Hub: https://hub.docker.com/
- Docker開源: https://www.docker.com/open-source
中文資源
- Docker中文網站:http://www.docker.org.cn
- Docker中文文件:http://www.dockerinfo.net/document
- Docker安裝手冊:http://www.docker.org.cn/book/install.html
- 一小時Docker教程 :https://blog.csphere.cn/archives/22
- Docker中文指南:http://www.widuu.com/chinese_docker/index.html
其它資源
相關文章
- Docker 入門學習筆記一:Ubuntu安裝 DockerDocker筆記Ubuntu
- Docker 入門學習筆記二:常用命令Docker筆記
- Docker 入門筆記Docker筆記
- TS入門學習筆記筆記
- 【PostgreSQL】入門學習筆記SQL筆記
- git入門學習筆記Git筆記
- Unity學習筆記--入門Unity筆記
- ActionScript 學習筆記(入門)筆記
- JavaScript入門學習學習筆記(上)JavaScript筆記
- Go 入門指南學習筆記Go筆記
- React入門指南(學習筆記)React筆記
- pandas 學習筆記 (入門篇)筆記
- HTML入門學習筆記(二)HTML筆記
- MySQL學習筆記---入門使用MySql筆記
- JavaScript入門-學習筆記(一)JavaScript筆記
- Dubbo學習筆記(一) 入門筆記
- golang入門學習筆記(一)Golang筆記
- Kotlin 入門學習筆記Kotlin筆記
- LDA入門級學習筆記LDA筆記
- Docker 學習筆記Docker筆記
- Docker學習筆記Docker筆記
- 【docker】Docker入門到實踐 筆記Docker筆記
- Elasticsearch入門學習重點筆記Elasticsearch筆記
- 【MongoDB學習筆記】MongoDB 快速入門MongoDB筆記
- java學習筆記1(入門級)Java筆記
- JavaScript學習筆記1—快速入門JavaScript筆記
- 安卓學習筆記20:Fragment入門安卓筆記Fragment
- 爬蟲入門學習筆記3爬蟲筆記
- node 學習筆記 基礎入門筆記
- webpack 學習筆記:入門介紹Web筆記
- 【Laravel 入門教程】學習筆記 1Laravel筆記
- 微信小程式入門學習筆記微信小程式筆記
- 學習筆記|AS入門(六) 碎片Fragment筆記Fragment
- angular學習筆記(一)-入門案例Angular筆記
- python學習筆記(一)——入門Python筆記
- redis學習筆記1: Redis入門Redis筆記
- CANopen學習筆記(一)CANopen入門筆記
- Docker 入門學習筆記三:Docker獨立IP及容器互聯(待處理)Docker筆記