目錄 start
目錄 end|2020-01-28 17:29|
Docker
Official Doc | docker-cn
Docker中國
簡介
Docker 是一個開源的應用容器引擎
理解爲加強版虛擬機- 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
個人理解
- docker中的容器是動態的,隨時創建和銷燬,只有鏡像是持久化的
- 而且容器是一個虛擬出來的功能完備的Linux操作系統可以進行登錄運行命令
docker images
來得到所有的本地鏡像名- 使用
docker run --name {name} -d {image-name}
新命名一個容器來啓動某個鏡像 - 然後
docker ps
查看容器運行狀況
- 使用
- 鏡像的命名:
- 如果要push到倉庫就要遵循這個規範,本地用就無所謂了,而且以後也可以取新的名字
docker tag 原名 新名
- 官方的hub:
用戶名/鏡像名:tag
- 非官方的例如阿里
registry.cn-hangzhou.aliyuncs.com/myth/jdk8:alpine
jdk8是鏡像名,前面的是倉庫地址
- 如果要push到倉庫就要遵循這個規範,本地用就無所謂了,而且以後也可以取新的名字
學習資源
- PMD: player with docker
啥都不說了, 直接幹
- todo Use multi-stage builds
17.05+
安裝與卸載
Linux
Official doc
所有的發行版
docker.io 是舊版本 現在新的Docker分爲 docker-ce docker-ee
注意 Deepin上 如果通過 apt 去安裝 docker-compose 它會把 docker-ce 卸掉, 裝舊的 docker.io
安裝包安裝
- Debian系
- deb包選擇
- 進去後選擇debain的版本,deepin15.4 的版本是stretch 然後pool/stable/amd64/選版本即可
- 例如:Deepin 15.4直接點這裏
這兩種方式裝的是同一個版本號
- 雙擊或者
sudo dpkg -i deb文件
- 測試安裝成功
sudo docker run hello-world
Ubuntu
- Official: Ubuntu安裝最新版
sudo apt install docker-ce
- 關閉服務則是標準服務操作, service docker stop
snap
- 安裝snap
sudo apt install snapd
- 查看適用於當前系統的包:
snap install find
- 安裝:
snap install docker
Debian
sudo echo "deb http://http.debian.net/debian jessie-backports main" >> /etc/apt/sources.list
sudo apt-get install docker-ce
前置軟件
sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg2
lsb-release
software-properties-common
使用阿里雲鏡像源
- curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -
- sudo add-apt-repository
“deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian
$(lsb_release -cs) stable”
- 特別注意
lsb_release -cs
命令的執行結果, 本應該獲取到的是發行代號 jessie stretch 等等, 但是Deepin15.8執行結果是 unstable …- 所以要手動添加 或修改爲 jessie
deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian jessie stable
使用官方源
- curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
- sudo add-apt-repository
“deb [arch=amd64] https://download.docker.com/linux/debian
$(lsb_release -cs) stable”
Centos
sudo yum install docker
- Ubuntu的話,Docker沒有啓動, 只要一執行Docker相關命令就會自動啓動, 但是Centos要手動啓動
service docker start
設置開機啓動:chkconfig docker on
Arch
pacman -S docker
不加sudo執行docker命令
- 如果沒有docker組,添加組
sudo groupadd docker
- 將當前用戶加入用戶組
sudo gpasswd -a $USER docker
- 然後重新註銷登錄,或者退出會話重新登錄即可
Windows
Windows上本質是用了VirtualBox創建虛擬機來跑Docker, 屎一般的體驗, 然而Win10的WSL因爲不能模擬aufs 以及 cgroup 所以能裝不能用
只能裝上docker for windows 然後把Docker守護進程的套接字文件配置給wsl用。。。。。
- 參考博客
- 官方toolbox 下載
- 然後雙擊安裝,勾選上virtualbox 記住cpu要開虛擬化
- 安裝完成後就會有三個圖標在桌面上,然後進入Docker Quickstart Terminal後
docker run hello-world
有正常輸出即可
基礎管理
docker 所有的數據默認存儲在
/var/lib/docker
鏡像倉庫
默認的DockerHub因爲在國外所以網絡不太穩定
Docker中國
三種使用的方式
- 使用指定的URL
docker pull registry.docker-cn.com/myname/myrepo:mytag
- 僅僅配置當前守護進程, 重啓就失效了
docker --registry-mirror=https://registry.docker-cn.com daemon
- 修改
/etc/docker/daemon.json
文件, 永久性更改
{"registry-mirrors": ["https://registry.docker-cn.com"]}
時速雲
sudo docker pull index.tenxcloud.com/<namespace>/<repository>:<tag>
- 下載後可以用別名
docker tag index.tenxcloud.com/docker_library/node:lastest node:lastest
- 然後爲了控制檯乾淨可以直接將原來的長命名tag直接刪除
阿里雲
- 開發者平臺
- 配置命名空間,倉庫,然後使用文檔的配置即可
百度雲
- 個人較爲推薦使用 | 官方文檔
-
登錄百度雲鏡像倉庫
- sudo docker login --username=[username] hub.baidubce.com
- username:鏡像倉庫名稱,即是
開通鏡像倉庫時填寫的用戶名
。輸入密碼後完成登錄。
-
上傳鏡像
- sudo docker tag [ImageId] hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
- sudo docker push hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
- ImageId和鏡像版本號根據鏡像信息補充
- namespace是開通鏡像倉庫時填寫的命名空間
- ImageName是在控制檯創建的鏡像名稱
-
下載鏡像
- 登錄到鏡像倉庫,需輸入密碼
- sudo docker pull hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
-
使用加速器
- docker軟件源地址:https://mirror.baidubce.com
搭建本地鏡像倉庫
v1
- 服務器上運行 並映射到本地目錄
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
- 對服務器中docker已經有的鏡像 設置別名
docker tag 鏡像 ip:port/鏡像名
- docker push ip:port/鏡像名
- 查看服務器上倉庫的鏡像
curl http://IP:5000/v1/search
v2
- 啓動鏡像
docker run -d -p 5000:5000 --name registry registry:2
- 一樣的設置好別名, 然後push上去
- 查看倉庫中的鏡像
curl IP:5000/v2/_catalog
注意 由於 docker client 默認是用的 HTTPS 方式通信, 但是這個本地的 registry 默認是 HTTP 的, 所以有幾種解決方案
- 直接將本地倉庫的IP和端口 設置爲本地Docker的白名單
- 給dockerd 添加參數
DOCKER_OPTS="--insecure-registry ip:port"
- 或者配置 /etc/docker/daemon.json
{ "insecure-registries":["IP:PORT"] }
- 重啓Docker服務
- 給dockerd 添加參數
- 配置 registry 爲 HTTPS, 那麼就需要配置SSL證書, 使用本地證書或者公網證書
基礎命令
直接運行 docker, 就會有命令的使用提示 例如查看docker版本
docker version
登錄鏡像倉庫
- 登錄hub.docker :
docker login
或者docker login -u username -p password
- 登錄時速雲:
sudo docker login index.tenxcloud.com
- 登錄百度雲:
docker login --username=[username] hub.baidubce.com
鏡像命令
- 查看所有 :
docker images
- docker images -a 查看所有鏡像(包括中間鏡像)
- 搜索 :
docker search 鏡像名
- 安裝 :
docker pull 鏡像名
- 刪除 :
docker rmi 鏡像名
- 查看詳細:
docker inspect [-f {{".Architesture"}}]
-f 查看JSON格式的具體節點的數據值 - 查看歷史:
docker history imagename
- 添加標籤(別名):
docker tag originname newname
- 導出鏡像文件:
docker save -o ubuntu.tar ubuntu:14.04
- 導入鏡像文件:
docker load --input ubuntu.tar
或docker load < ubuntu.tar
- 導入鏡像文件:
- 上傳鏡像:
docker push mythos/test:lastest
容器命令
-
查看所有容器的狀態:
docker stats
能看到正在運行的容器內存 cpu io net等信息-a
所有容器--no-stream
不阻塞標準輸出流,只輸出一次信息
-
停止容器:
docker stop 容器name
-
重啓容器:
docker restart 容器name
-
啓動容器:
docker start 容器name
- -i 交互模式,也可以進入終端
-
刪除容器:
docker rm 容器name
-f
強行停止正在運行的容器並刪除-l
刪除容器的連接,但是保留容器-v
刪除容器掛載的數據卷- 刪除所有容器:
docker rm ${docker -a -q}
- 刪除所有容器和掛載的目錄:
docker system prune --volumes -f
-
容器日誌(終端所有輸入輸出):
docker logs 容器name或id
-
重命名 :
docker rename origin new
-
導入導出 (容器快照):
- 導出:
docker export -o test.tar 容器名
docker export 容器name > test.tar
- 導入:
docker import [-c |--change=[]] [-m | --message=[]] file|URL - [repository]:[tag]
- -c | --change=[] 選項在導入的同時執行對容器就行修改的Dockerfile指令。
- 導出:
ps
- 查看當前運行的容器:
docker ps
- 查看所有容器 :
docker ps -a
- 查看佔用 :
docker ps -s
- ps formatting
- 查看所有容器 :
.ID Container ID
.Image Image ID
.Command Quoted command
.CreatedAt Time when the container was created.
.RunningFor Elapsed time since the container was started.
.Ports Exposed ports.
.Status Container status.
.Size Container disk size.
.Names Container names.
.Labels All labels assigned to the container.
.Label Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'
.Mounts Names of the volumes mounted in this container.
.Networks Names of the networks attached to this container.
create
run
Docker run 命令的使用方法
等價於 docker create 再 docker start
docker run -d --name conrainer-name image-name touch a.md
,如果鏡像本地沒有會自動pull--name
配置容器名字-d
後臺啓動程序-i
交互模式運行容器(標準輸入和標準輸出)docker run -it ubuntu /bin/bash
-t
容器啓動後進入其命令行-v
將本地文件夾建立映射到容器內-v 本機:容器
-p
端口映射左本機右容器:-p 44:22
主機容器端口相同就:-p 22
將容器所有EXPOSE的端口映射到宿主機隨機端口-P
- 綁定udp端口
-p 44:22/udp
- 綁定udp端口
--env name="tanky"
設置環境變量--cpu-shares
設置CPU的相對權重,只在link之間容器的權重比例--cpuset-cpus
限制只能運行在某標號的CPU上--user
-u 限制用戶--cap-drop
去除能力--link
鏈接其他容器--rm
容器運行結束退出就自動刪除該容器 注意和-d
不能共存--restart=always
設置該容器隨dokcer 服務自啓動--hostname 容器hostname
指定容器的hostname
-e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro
資源限制
內存限制
- 限制最大內存100M
--memory 100M
或者-m 100M
- 配置交換內存不受限制
--memory-swap -1
- 不配置該項 或者 該項小於 --memory 則都是採用默認值, --memory 的兩倍
exec
-
登錄容器:
docker exec -it 容器name或id bash
docker attach 容器id
這個命令雖然簡單,但是退出會話就自動關閉了容器
-
這些選項不加就是默認值,加上短參數形式就是設爲另一個值 如 -t
-i
,--interactive=ture|false
打開標準輸入接受用戶輸入命令--privileged=true|false
是否給以最高權限-t
,--tty=true|false
是否分配僞終端-u
,--user=""
執行命令的用戶或ID
-
使用 nsenter 連接到容器:
- PID=${docker-pid 容器id}
- nsenter --target $PID --mount --uts --ipc --net --pid
commit
docker commit 容器id 鏡像name
將容器爲id的當前容器 保存爲name鏡像
port
查看容器的端口映射情況, 輸出是左容器右本機, 和使用相反
端口映射
- 當不指定對應的參數容器默認不開放任何端口給外部,可以使用
-P
或-p
參數來開放- -P 隨機映射一個 49000-49900 的端口到容器開放的端口
- -p
IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort
- 映射到指定IP的指定端口
IP:HostPort:ContainerPort
- 映射到指定IP的任意端口
IP::ContainerPort
- 映射到所有接口的地址的指定端口
HostPort:ContainerPort
- 映射到指定IP的指定端口
- 還可以使用 udp來標記爲udp類型
docker run -d -p 127.0.0.1::5000/udp ubuntu apt update
- 查看端口
- 查看容器內5000對應的外端口
docker port ubuntu17 5000
- 查看容器的具體信息
docker inspect 容器id
- 查看容器內5000對應的外端口
數據卷
-
數據卷是一個可供容器使用的特殊目錄,它將宿主機操作系統目錄映射進容器 類似於 mount操作
- 數據卷可以在容器之間共享重用
- 數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作
- 對數據卷的更新不會影響鏡像,解耦了應用和數據
- 卷會一直存在,直到沒有容器使用,纔可以安全的卸載
-
docker run -v dir:dir[:ro]
一般是創建容器時使用,和-p類似可以多個,左本機右容器 默認rw權限可以指定 ro只讀- 可以將一個文件掛載爲數據卷,但是文件夾更好,文件可能會有問題出現
-
掛載宿主機時區及時間
/etc/localtime:/etc/localtime
數據卷容器
docker run -it -v /test --name data ubuntu
運行一個掛載了數據卷的容器- 引用數據卷容器 來掛載數據卷:
docker run -it --volumes-from data --name db1 ubuntu
- 從已經掛載了數據卷容器的容器 來掛載數據卷:
docker run -it --volumes-from db1 --name db2 ubuntu
- 使用
--volumes-from
參數所掛載數據卷的容器並不需要保持在運行狀態 - 如果刪除了掛載的容器,數據卷並不會自動刪除,而是要在刪除最後一個容器時 使用
docker rm -v
來聲明刪除容器並刪除關聯的數據卷
利用數據卷容器來遷移數據
- 備份:
docker run --volumes-from data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /data
- 先基於Ubuntu創建一個worker容器並引用了數據卷容器data,然後將當前目錄作爲數據卷掛載進去,並執行tar命令,打包到數據卷容器的目錄下
- 實現了將當前目錄歸檔到數據卷容器下
- 恢復:
- 創建一個帶有數據卷的容器(目標容器)
docker run -v /data --name reuse ubuntu /bin/bash
- 解壓當前目錄的tar文件到數據卷容器中
docker run --volumes-from reuse -v $(pwd):/backup busybox tar xvf /backup/backup.tar
- 這個就是實現了將本地的歸檔數據放到指定的容器內,如果要從數據卷容器中恢復到別的容器就只要掛載對應的數據卷容器然後進目錄直接解壓即可
- 創建一個帶有數據卷的容器(目標容器)
容器編排
Docker-Compose
聲明式環境,管理多容器, 並處理好相關資源的關係
- 安裝
- 最簡單:
sudo pip install docker-compose
- 最簡單:
配置文件
一個配置文件就表示了一組容器, 以及相關的網絡,文件等配置, docker-compose 都是基於該配置文件進行基本命令操作
語法上和 docker run 基本一致, 只不過以 yml 形式配置而已
version: "2.1"
services:
zookeeper:
image: ${IMAGE_NAME:-defaultImage}
expose:
- "6666"
ports:
- "6666:6666"
volumes:
- /etc/localtime:/etc/localtime
command: ./bin/start.sh
links:
- "mysql:mysql"
environment:
- NAME=who
使用命令
必須要在 docker-compose.yml 文件目錄下執行
- help
- up # 自動完成構建鏡像,
創建
服務,啓動服務,並關聯服務等操作,-d
後臺執行 - down # 停止並
刪除
該服務的所有容器, 移除網絡,-v
移除掛載的volume - start # 啓動存在的服務
- stop # 停止
- restart # 重啓項目中服務
- exec # 進入指定容器
- image # 列出 Compose 文件中包含的鏡像
- kill [SERVICE…]
- pause [SERVICE…]
- unpause [SERVICE…]
- ps # 列出項目中所有容器
Tips
yml所在的目錄名會作爲容器名的前綴
Docker-Machine
創建一個docker集羣環境 官方文檔安裝
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
Error with pre-create check: “This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory”
Docker-Swarm
網絡
Official Doc 分爲 none host brige user-defined 幾種類型
None
docker run -it --network none busybox
- 不聯網的容器, ifconfig 可以看到只有 lo
Host
docker run -it --network host busybox
- 採用宿主機的網絡, 也就是說和宿主機使用同一個網絡環境, hostname都是host的
- 特點是性能, 但是不夠靈活, 要考慮和host上的端口衝突問題
- 直接配置host的網絡: 例如配置防火牆容器
Bridge
安裝 Docker 的時候, 都會創建一個 docker0 的網橋 Linux bridge
- 如果沒有指定
--network
或者使用--network default
創建容器 都會默認掛載到 docker0 上 - 通過
docker network inspect bridge
命令可以看到子網掩碼是172.17.0.0/16
網關是 172.17.0.1- 也就是說能容納 2的16次冪 -2 個容器 (65534), 容器創建時會依次分配ip
注意: 此方式下容器之間是互通的, 通常使用的
--link containerName:aliasName
也只不過是在 /etc/hosts 文件中添加了容器的 dns 而已
特別容易出現鎖,一個沒有啓動,其他的都啓動不了 嘗試?
sudo service docker restart
- 例如:
創建一個MySQL容器供一個Ubuntu容器使用
- 創建MySQL容器
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=ad -d mysql
- 創建Ubuntu容器
docker run -d --name test --link mysql2:db ubuntu
- link參數說明 :
--link name:alias
在父容器中會將該映射加入host文件,所以無需找ip,直接使用別名
- link參數說明 :
- docker會連接兩個容器,而不用通過暴露端口來實現,web容器的host文件以及環境變量都會追加上mysql2的配置
- 所以在Ubuntu容器中連接MySQL容器,
mysql -h db -u root -pad
即可連接上mysql- 如需看IP就
cat /etc/hosts
中myslq容器別名爲db值的IP地址 - 或者直接
ping db
apt install inetutils-ping
ifconfig就要安裝net-tools
- 如需看IP就
- 例如:
創建一個Nginx和一個Springboot搭建的web服務
- 構建Springboot應用鏡像,構建應用容器 開放8888端口
- 新建nginx容器:
docker run --name youhuigo -d -p 80:80 -v /home/kuang/nginx/conf/:/etc/nginx/conf.d/:ro --link you:web nginx
- 配置文件:
一樣的cat /etc/hosts 查看容器的IP
, 其實最簡單就是用link配置時的別名即可,因爲Docker已經幫我們配置好了host。。。
upstream youhui {
server 172.17.0.4:8888;
}
server {
listen 80;
server_name youhui;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;
proxy_pass http://youhui;
proxy_redirect off;
}
}
weave
能解決跨宿主機的容器互聯問題
User-defined
Docker 提供三種 網絡驅動 bridge overlay macvlan, 後兩者可用於跨主機的容器通信
跨主機容器通信
overlay
Dockerfile
dockerignore文件的使用
- .dockerignore文件是依據 Go 的 PathMatch 規範來的,使用和.gitignore類似