Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

第 1 章 Docker

目錄

1.1. Installation
1.1.1. CentOS 8
1.1.1.1. docker-compose
1.1.2. CentOS 6
1.1.3. CentOS 7 docker-ce
1.1.4. Ubuntu
1.1.5. Ubuntu docker-ce
1.1.6. 測試 Docker
1.1.7. 重置 Docker
1.2. 配置 Docker
1.2.1. 開啟遠程訪問
1.2.2. 鏡像配置
1.2.2.1. 臨時選擇鏡像
1.2.2.2. 切換國內鏡像
1.2.3. ulimit 資源
1.3. 鏡像
1.3.1. 搜索鏡像
1.3.2. 獲取鏡像
1.3.3. 列出本地鏡像
1.3.4. tag
1.3.5. 保存和載入鏡像
1.3.6. 刪除本地鏡像
1.3.7. history 鏡像歷史紀錄
1.3.8. 基于 Dockerfile 創建鏡像
1.3.8.1. 創建 Dockerfile 檔案
1.3.8.2. 創建鏡像
1.3.8.3. 運行鏡像
1.3.8.4. 測試 Nginx
1.3.8.5. 提交鏡像
1.3.8.6. Dockerfile 語法
1.3.8.6.1. COPY
1.3.8.6.2. EXPOSE
1.4. 容器
1.4.1. 查看容器
1.4.2. 啟動與終止容器
1.4.3. 進入容器
1.4.4. 運行容器內的命令
1.4.5. 導出和導入容器
1.4.5.1. Ubuntu
1.4.5.2. Mac 導出與導入
1.4.6. 停止所有容器
1.4.6.1. 信號處理
1.4.7. 刪除容器
1.4.8. log-driver
1.4.9. 操作系統
1.4.9.1. 設置環境變數
1.4.9.2. /etc/hosts 配置
1.4.9.3. sysctl
1.4.9.4. ulimits
1.4.10. 查看容器內運行的進程
1.4.11. 更新容器資源配置
1.4.12. 查看容器的退出狀態
1.4.13. 暫停與恢復容器
1.4.14. 對比容器的變化
1.4.15. 查看容器狀態
1.4.16. 重啟容器
1.5. 卷管理
1.5.1. 列出卷
1.5.2. 創建卷
1.5.3. 掛在鏡像
1.5.4. 檢查卷
1.5.5. 刪除卷
1.5.6. 銷毀所有未使用的卷
1.5.7. 在多個容器間共享卷
1.5.8. 容器綁定本地檔案系統
1.5.9. 只讀權限
1.6. 倉庫
1.6.1. Docker 官方倉庫
1.6.1.1. 登陸倉庫
1.6.1.2. 獲取鏡像
1.6.1.3. 上傳鏡像
1.6.2. 私有倉庫
1.6.2.1. 搭建私有倉庫
1.6.2.2. 推送鏡像到私有倉庫
1.6.2.3. 查詢鏡像
1.6.2.4. registry 鏡像高級配置
1.6.2.4.1. 私有倉庫認證
1.6.2.5. registry 介面
1.6.3. Harbor
1.7. Swarms
1.7.1. 管理 Swarms
1.7.1.1. 查看 Swarms 版本
1.7.1.2. 初始化 Swarms
1.7.1.3. 顯示 join-token
1.7.1.4. 創建虛擬機
1.7.1.5. 顯示虛擬機列表
1.7.1.6. 設置管理節點
1.7.1.7. 環境變數
1.7.1.8. 切換節點
1.7.1.9. 啟動/停止節點
1.7.1.10. 離線
1.7.2. Stack
1.7.3. 服務
1.7.3.1. 創建 Service
1.7.3.2. 刪除 Service
1.7.3.3. inspect
1.7.4. Docker 網絡
1.7.4.1. 創建 overlay 網絡
1.7.5. swarm 卷管理
1.7.5.1. Host Volumes
1.7.5.2. Named Volumes
1.7.5.3. 共享卷
1.8. docker 命令
1.8.1. docker - A self-sufficient runtime for containers
1.8.1.1. 查看 docker 信息
1.8.1.2. run
1.8.1.3. start / stop / restart
1.8.1.4. ps
1.8.1.5. top
1.8.1.6. inspect
1.8.1.6.1. 獲取容器名稱
1.8.1.6.2. 容器鏡像名稱
1.8.1.6.3. 獲取容器主機名 Hostname
1.8.1.6.4. 查詢 IP 地址
1.8.1.6.5. 容器日誌
1.8.1.6.6. 獲取 json 配置
1.8.1.6.7. 函數
1.8.1.6.8. 綜合查詢
1.8.1.7. images
1.8.1.7.1. Getting a new image
1.8.1.8. logs
1.8.1.9. 重置 Docker
1.8.1.10. 倉庫操作
1.8.1.10.1. 登陸
1.8.1.10.2. 註銷
1.8.1.11. build
1.8.1.12. 網絡管理
1.8.1.13. 事件信息
1.8.2. docker-compose - Define and run multi-container applications with Docker.
1.8.2.1. 安裝 docker-compose
1.8.2.1.1. 使用 pip 安裝
1.8.2.1.2. OSCM 安裝
1.8.2.2. 快速入門
1.8.2.3. 啟動/停止
1.8.2.3.1. 啟動
1.8.2.3.2. 停止
1.8.2.4. 查看進程
1.8.2.5. 查看日誌
1.8.2.6. 執行命令
1.8.2.7. docker-compose.yml
1.8.2.7.1. 版本號
1.8.2.7.2. 鏡像
1.8.2.7.3. 容器名稱
1.8.2.7.4. 啟動策略
1.8.2.7.5. 容器用戶
1.8.2.7.6. 掛在卷
1.8.2.7.7. 映射連接埠的標籤
1.8.2.7.8. 添加 hosts 檔案
1.8.2.7.9.
1.8.2.7.10. 設置環境變數
1.8.2.7.11. 臨時檔案系統
1.8.2.7.12. 編譯 Dockerfile
1.8.2.7.13. resources 硬件資源分配
1.9. Docker Example
1.9.1. registry
1.9.1.1. Auth + SSL
1.9.2. Example Java - Spring boot with Docker
1.9.2.1. 獲取 CentOS 7 鏡像
1.9.2.2. 安裝 openjdk
1.9.2.3. Spring boot 包
1.9.2.4. 啟動 Spring boot 項目
1.9.2.5. 基于 CentOS 7 製作 spring 鏡像
1.9.3. Redis
1.9.3.1. Docker 命令
1.9.3.1.1. 獲取 Redis 鏡像
1.9.3.1.2. 啟動一個 Redis 實例
1.9.3.1.3. 進入 Redis
1.9.3.1.4. 啟動一個 Redis 實例並映射 6379 連接埠
1.9.3.1.5. 維護容器
1.9.3.2. Docker compose
1.9.3.3. Docker Stack
1.9.4. Nginx
1.9.4.1. nginx:latest
1.9.4.2. 安裝 Docker Nginx alpine
1.10. Docker FAQ
1.10.1. 檢查 Docker 是否可用
1.10.2. Bitnami
1.10.3. 刪除 <none> 鏡像

https://www.docker.com

1.1. Installation

1.1.1. CentOS 8

下載 containerd.io https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

		
[root@localhost ~]# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
		
		

安裝 Docker

		
[root@localhost ~]# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

[root@localhost ~]# dnf install -y docker-ce

[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker
		
		

		
[root@localhost ~]# docker -v
Docker version 19.03.12, build 48a66213fe
		
		

1.1.1.1. docker-compose

https://docs.docker.com/compose/install/

			
curl -sL "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose			
			
			

1.1.2. CentOS 6

			
yum install docker-io
service docker start
chkconfig docker on
docker pull centos:latest
docker images centos
			
		

test

			
docker run -i -t centos /bin/bash
			
		

1.1.3. CentOS 7 docker-ce

從官方網站獲得最新社區版

			
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce

systemctl start docker
			
		

測試安裝是否成功

			
docker run hello-world
			
		

1.1.4. Ubuntu

Ubuntu 預設版本

			
$ sudo apt update
$ sudo apt install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
			
		
			
$ sudo docker run -i -t ubuntu /bin/bash
			
		

1.1.5. Ubuntu docker-ce

從官方網站獲得最新社區版

		
#!/bin/bash

sudo apt remove docker docker-engine

sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
	
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
   
sudo apt update
sudo apt install docker-ce

apt-cache madison docker-ce
		
		

啟動參數配置 /etc/default/docker

		
neo@ubuntu:~$ cat /etc/default/docker
# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/admin/systemd/
#

# Customize location of Docker binary (especially for development testing).
#DOCKERD="/usr/local/bin/dockerd"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp"

		
		

啟動腳本 /etc/init/docker.conf

		
neo@ubuntu:~$ sudo cat /etc/init/docker.conf
[sudo] password for neo: 
description "Docker daemon"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [!2345]

limit nofile 524288 1048576

# Having non-zero limits causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
limit nproc unlimited unlimited

respawn

kill timeout 20

pre-start script
	# see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount
	if grep -v '^#' /etc/fstab | grep -q cgroup \
		|| [ ! -e /proc/cgroups ] \
		|| [ ! -d /sys/fs/cgroup ]; then
		exit 0
	fi
	if ! mountpoint -q /sys/fs/cgroup; then
		mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
	fi
	(
		cd /sys/fs/cgroup
		for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
			mkdir -p $sys
			if ! mountpoint -q $sys; then
				if ! mount -n -t cgroup -o $sys cgroup $sys; then
					rmdir $sys || true
				fi
			fi
		done
	)
end script

script
	# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
	DOCKERD=/usr/bin/dockerd
	DOCKER_OPTS=
	if [ -f /etc/default/$UPSTART_JOB ]; then
		. /etc/default/$UPSTART_JOB
	fi
	exec "$DOCKERD" $DOCKER_OPTS --raw-logs
end script

# Don't emit "started" event until docker.sock is ready.
# See https://github.com/docker/docker/issues/6647
post-start script
	DOCKER_OPTS=
	DOCKER_SOCKET=
	if [ -f /etc/default/$UPSTART_JOB ]; then
		. /etc/default/$UPSTART_JOB
	fi

	if ! printf "%s" "$DOCKER_OPTS" | grep -qE -e '-H|--host'; then
		DOCKER_SOCKET=/var/run/docker.sock
	else
		DOCKER_SOCKET=$(printf "%s" "$DOCKER_OPTS" | grep -oP -e '(-H|--host)\W*unix://\K(\S+)' | sed 1q)
	fi

	if [ -n "$DOCKER_SOCKET" ]; then
		while ! [ -e "$DOCKER_SOCKET" ]; do
			initctl status $UPSTART_JOB | grep -qE "(stop|respawn)/" && exit 1
			echo "Waiting for $DOCKER_SOCKET"
			sleep 0.1
		done
		echo "$DOCKER_SOCKET is up"
	fi
end script
		
		
		

1.1.6. 測試 Docker

		
neo@MacBook-Pro ~ % docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

neo@MacBook-Pro ~ % docker image ls 
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
hello-world                                latest              fce289e99eb9        2 months ago        1.84kB

neo@MacBook-Pro ~ % docker container ls --all
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
ea694b443e9e        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       dreamy_feistel
		
		

1.1.7. 重置 Docker

		
docker stop $(docker ps -a -q)
docker rm -f $(docker ps -a -q)
docker rmi -f $(docker images -q)
docker volume rm $(docker volume ls -q)