1 Docker Hello World
簡單命令
docker run ubuntu:15.10 /bin/echo "Hello world"
docker run:啟動一個新容器。
ubuntu:15.10:使用的 Docker 鏡像(Ubuntu 15.10 版本)。
Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
/bin/echo “Hello world”:容器啟動后執行的命令,即調用 shell 的 echo 命令打印 Hello world。
補充
在 Docker 命令中,/bin 是 Linux 系統路徑的一部分,表示二進制可執行文件目錄。Docker 基于 Linux 內核,因此沿用了這一路徑約定。以下是具體解釋:
- /bin 在 Linux 中的作用
在 Linux 系統中,/bin 目錄存放系統必備的基礎命令,例如:
ls(列出文件)
cp(復制文件)
echo(打印文本)
bash(Shell 解釋器)
這些命令是系統運行的基礎,即使在最小化環境中也會被使用。
為什么不能省略 /bin?
在 Linux 中,命令的完整路徑是 /bin/命令名。雖然在終端中可以直接輸入 echo 而無需 /bin/echo**,但這是因為 PATH 環境變量包含了 /bin 目錄。而在 Docker 命令中,若直接寫 echo,Docker 會嘗試在容器的 PATH 中查找該命令。雖然大多數情況下能找到,但為了明確指定命令路徑**,避免歧義,建議使用完整路徑 /bin/echo。
進階命令
docker run -it ubuntu:15.10 /bin/bash
-t: 在新容器內指定一個偽終端或終端。
-i: 允許你對容器內的標準輸入 (STDIN) 進行交互
bash就是進入了一個腳本 你可以使用常見命令
此時我們已進入一個 ubuntu15.10 系統的容器
root@0123ce188bd8:/# cat /proc/version
Linux version 4.4.0-151-generic (buildd@lgw01-amd64-043) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #178-Ubuntu SMP Tue Jun 11 08:30:22 UTC 2019
root@0123ce188bd8:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@0123ce188bd8:/#
我們可以通過運行 exit 命令或者使用 CTRL+D 來退出容器
后臺進程
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
69f8426a40aa3277e469ca45418b902a386cd341bff7962e63f63c0da2237aac
這個d 證明在后臺進行容器運行
這個c 代表 選項允許你直接傳遞一個命令字符串給 shell,而不是從腳本文件或標準輸入讀取命令
while true 表示一個無限循環,echo hello world 用于輸出 hello world 文本,sleep 1 表示暫停 1 秒鐘。所以這個容器會持續運行,并且每隔 1 秒打印一次 hello world 到容器的標準輸出中
下面返回值代表 容器id
查看正在運行的容器
ffmpeg@BF-202404020446:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8426a40aa ubuntu:15.10 "/bin/sh -c 'while t…" About a minute ago Up About a minute sharp_sanderson
這條輸出是 docker ps
命令的結果,展示了當前正在運行的 Docker 容器的狀態信息。以下是對各字段的詳細解釋:
輸出字段解析
字段 | 值 | 說明 |
---|---|---|
CONTAINER ID | 69f8426a40aa | 容器的唯一標識符(簡寫形式),完整 ID 更長(如 69f8426a40aa... ) |
IMAGE | ubuntu:15.10 | 創建容器使用的鏡像(Ubuntu 15.10 版本) |
COMMAND | "/bin/sh -c 'while t…" | 容器啟動時執行的命令(被截斷顯示,完整命令是 while true; do echo hello world; sleep 1; done ) |
CREATED | About a minute ago | 容器創建的時間(約 1 分鐘前) |
STATUS | Up About a minute | 容器運行狀態(已運行約 1 分鐘) |
PORTS | (空) | 容器端口映射情況(此容器未映射任何端口) |
NAMES | sharp_sanderson | 容器的自動生成名稱(Docker 隨機命名,格式為 形容詞_名詞 ) |
查看標準輸出
docker logs CONTAINER ID
docker logs 是 Docker 提供的一個命令,用于查看容器的 ** 標準輸出(STDOUT)和標準錯誤(STDERR)** 內容。在容器內部運行的程序(如 Web 服務器、腳本等)產生的日志信息,都可以通過這個命令獲取。
ffmpeg@BF-202404020446:~$ docker logs 69f8426a40aa # 你也可以name
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
停止容器
docker stop id/name
docker stop sharp_sanderson
sharp_sanderson
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
補充如何刪除這些不需要的日志
root@BF-202404020446:/var/lib/docker/containers# ll
total 44
drwx--x--- 11 root root 4096 May 14 11:05 ./
drwx--x--- 13 root root 4096 May 12 10:56 ../
drwx--x--- 4 root root 4096 May 13 19:45 262ebacf3b6bcea3e46e014918940542f88bcad2833db98a600ff708b834ce59/
drwx--x--- 4 root root 4096 May 12 10:56 3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f/
drwx--x--- 4 root root 4096 May 14 10:36 4dd4ecedd1372fc368816e0880d6342c503224e67a8ccd1584e1acbca65efab6/
drwx--x--- 4 root root 4096 May 14 11:16 69f8426a40aa3277e469ca45418b902a386cd341bff7962e63f63c0da2237aac/
drwx--x--- 4 root root 4096 May 14 10:57 afa05a3d1c35064c5d719f1be5ce7ae4c7ad2419fdd763c49fa82fa5e1d49a83/
drwx--x--- 4 root root 4096 May 14 10:36 cb54995f81932ea8870ac2d1300a474d029bfc3b6aea710124f58e24e2f02998/
drwx--x--- 4 root root 4096 May 14 10:50 cb56264c4647601cfc2d25fff9fec20ab08f445bbae2e2f57a2c5fff3318abc4/
drwx--x--- 4 root root 4096 May 13 19:48 e2dddd2cf1162331f995441fccdc2ada267182bc0ebd073481a1132d23a8f8f8/
drwx--x--- 4 root root 4096 May 14 11:03 eb6a4c11bf42fa840b15130866015cfb82c52c60e40a0e9dd050ace43c45c368/
root@BF-202404020446:/var/lib/docker/containers# rm -rf *
root@BF-202404020446:/var/lib/docker/containers# ll
total 8
drwx--x--- 2 root root 4096 May 14 11:19 ./
drwx--x--- 13 root root 4096 May 12 10:56 ../
2 Docker 容器使用
Docker 容器是一個輕量級、可移植、自給自足的軟件環境,用于運行應用程序。
Docker 容器將應用程序及其所有依賴項(包括庫、配置文件、系統工具等)封裝在一個標準化的包中,使得應用能夠在任何地方一致地運行。
容器是操作系統級別的虛擬化,不需要運行完整的操作系統,啟動和運行更為高效。
鏡像與容器的關系
- 鏡像(Image):容器的靜態模板,包含了應用程序運行所需的所有依賴和文件。鏡像是不可變的。
- 容器(Container):鏡像的一個運行實例,具有自己的文件系統、進程、網絡等,且是動態的。容器從鏡像啟動,并在運行時保持可變。
Docker 客戶端
Docker 客戶端是與 Docker 守護進程(Docker Daemon)交互的命令行工具。
docker 客戶端非常簡單,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。
好的!以下是整理后的 Docker 容器管理命令表格,格式更加清晰:
2.1 命令
Docker 容器管理命令
命令 | 作用 | 示例 |
---|---|---|
docker run [選項] [鏡像] [命令] | 創建并啟動容器 | docker run -d -p 80:80 nginx (后臺運行,映射端口 80) |
docker ps | 列出正在運行的容器 | docker ps -a (顯示所有容器,包括已停止的) |
docker stop [容器ID/名稱] | 停止運行中的容器 | docker stop my-container |
docker start [容器ID/名稱] | 啟動已停止的容器 | docker start my-container |
docker restart [容器ID/名稱] | 重啟容器 | docker restart my-container |
docker rm [容器ID/名稱] | 刪除容器(需先停止容器) | docker rm my-container |
docker exec -it [容器] [命令] | 在運行的容器內執行命令(常用于進入容器) | docker exec -it my-container bash |
docker logs [選項] [容器] | 查看容器日志 | docker logs -f my-container (實時跟蹤日志) |
docker inspect [容器/鏡像] | 獲取容器或鏡像的詳細信息(JSON 格式) | docker inspect my-container |
docker stats [容器] | 實時監控容器的資源使用情況(CPU、內存等) | docker stats (監控所有容器) |
補充說明
- 常用選項:
-d
:后臺運行容器-it
:交互式運行,分配偽終端-p [主機端口]:[容器端口]
:端口映射-v [主機路徑]:[容器路徑]
:掛載數據卷--name [名稱]
:為容器指定自定義名稱--restart=always
:容器退出時自動重啟
2.2 命令展示
啟動已停止運行的容器
查看所有的容器命令如下
docker ps -a
root@BF-202404020446:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8426a40aa ubuntu:15.10 "/bin/sh -c 'while t…" 4 hours ago Exited (137) 4 hours ago sharp_sanderson
eb6a4c11bf42 ubuntu:15.10 "/bin/sh -c 'while t…" 5 hours ago Exited (137) 4 hours ago vigorous_golick
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (127) 5 hours ago objective_davinci
cb56264c4647 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (0) 5 hours ago trusting_greider
4dd4ecedd137 ubuntu:15.10 "/bin/echo 'Hello wo…" 5 hours ago Exited (0) 5 hours ago optimistic_lederberg
cb54995f8193 ubuntu:15.10 "/bin/echo 'Hello wo…" 5 hours ago Exited (0) 5 hours ago suspicious_sammet
e2dddd2cf116 ubuntu "bash" 20 hours ago Exited (130) 20 hours ago magical_lehmann
262ebacf3b6b hello-world "/hello" 20 hours ago Exited (0) 20 hours ago boring_elbakyan
3bd1d669bf6d hello-world "/hello" 3 days ago Exited (0) 3 days ago laughing_ptolemy
啟動容器
root@BF-202404020446:~# docker start afa05a3d1c35
afa05a3d1c35
root@BF-202404020446:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Up 26 seconds objective_davinci
后臺運行
root@BF-202404020446:~# docker run -itd --name test_ubuntu ubuntu:15.10 /bin/bash
effbfacb4fce517d93ebb60bc52d8cf69fa8573a03f91ad1fff348b62065da2d
root@BF-202404020446:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effbfacb4fce ubuntu:15.10 "/bin/bash" 9 seconds ago Up 9 seconds test_ubuntu
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Up 5 minutes objective_davinci
停止一個容器
root@BF-202404020446:~# docker stop afa05a3d1c35
afa05a3d1c35
root@BF-202404020446:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effbfacb4fce ubuntu:15.10 "/bin/bash" About a minute ago Up About a minute test_ubuntu
重啟容器
root@BF-202404020446:~# docker restart afa05a3d1c35
afa05a3d1c35
root@BF-202404020446:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effbfacb4fce ubuntu:15.10 "/bin/bash" 2 minutes ago Up 2 minutes test_ubuntu
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Up 7 seconds objective_davinci
進入容器
在使用 -d 參數時啟動容器時,容器會運行在后臺,這時如果要進入容器,可以通過以下命令進入:
docker exec:使用 docker exec 命令,因為此命令會退出容器終端,但不會導致容器的停止。
root@BF-202404020446:~# docker exec -it effbfacb4fce /bin/bash
root@effbfacb4fce:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@effbfacb4fce:/# exit
exit
刪除容器
ffmpeg@BF-202404020446:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effbfacb4fce ubuntu:15.10 "/bin/bash" 22 minutes ago Exited (0) 15 minutes ago test_ubuntu
69f8426a40aa ubuntu:15.10 "/bin/sh -c 'while t…" 5 hours ago Exited (137) 5 hours ago sharp_sanderson
eb6a4c11bf42 ubuntu:15.10 "/bin/sh -c 'while t…" 5 hours ago Exited (137) 5 hours ago vigorous_golick
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (0) 15 minutes ago objective_davinci
cb56264c4647 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (0) 5 hours ago trusting_greider
4dd4ecedd137 ubuntu:15.10 "/bin/echo 'Hello wo…" 5 hours ago Exited (0) 5 hours ago optimistic_lederberg
cb54995f8193 ubuntu:15.10 "/bin/echo 'Hello wo…" 5 hours ago Exited (0) 5 hours ago suspicious_sammet
e2dddd2cf116 a0e45e2ce6e6 "bash" 20 hours ago Exited (130) 20 hours ago magical_lehmann
262ebacf3b6b hello-world "/hello" 20 hours ago Exited (0) 20 hours ago boring_elbakyan
3bd1d669bf6d hello-world "/hello" 3 days ago Exited (0) 3 days ago laughing_ptolemy
ffmpeg@BF-202404020446:~$ docker rm -f 4dd4ecedd137
4dd4ecedd137
ffmpeg@BF-202404020446:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effbfacb4fce ubuntu:15.10 "/bin/bash" 25 minutes ago Exited (0) 18 minutes ago test_ubuntu
69f8426a40aa ubuntu:15.10 "/bin/sh -c 'while t…" 5 hours ago Exited (137) 5 hours ago sharp_sanderson
eb6a4c11bf42 ubuntu:15.10 "/bin/sh -c 'while t…" 5 hours ago Exited (137) 5 hours ago vigorous_golick
afa05a3d1c35 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (0) 18 minutes ago objective_davinci
cb56264c4647 ubuntu:15.10 "/bin/bash" 5 hours ago Exited (0) 5 hours ago trusting_greider
cb54995f8193 ubuntu:15.10 "/bin/echo 'Hello wo…" 6 hours ago Exited (0) 6 hours ago suspicious_sammet
e2dddd2cf116 a0e45e2ce6e6 "bash" 20 hours ago Exited (130) 20 hours ago magical_lehmann
262ebacf3b6b hello-world "/hello" 20 hours ago Exited (0) 20 hours ago boring_elbakyan
3bd1d669bf6d hello-world "/hello" 3 days ago Exited (0) 3 days ago laughing_ptolemy
ffmpeg@BF-202404020446:~$
查看信息
ffmpeg@BF-202404020446:~$ docker inspect 3bd1d669bf6d
[{"Id": "3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f","Created": "2025-05-11T06:57:45.729143667Z","Path": "/hello","Args": [],"State": {"Status": "exited","Running": false,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 0,"ExitCode": 0,"Error": "","StartedAt": "2025-05-11T06:57:45.797842413Z","FinishedAt": "2025-05-11T06:57:46.004596821Z"},"Image": "sha256:74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602","ResolvConfPath": "/var/lib/docker/containers/3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f/resolv.conf","HostnamePath": "/var/lib/docker/containers/3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f/hostname","HostsPath": "/var/lib/docker/containers/3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f/hosts","LogPath": "/var/lib/docker/containers/3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f/3bd1d669bf6df337adab212eae77d6934ff118fb33740a6487d029ae6ce6792f-json.log","Name": "/laughing_ptolemy","RestartCount": 0,"Driver": "overlay2",....
** 監控容器**
docke stats 容器id
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
3bd1d669bf6d laughing_ptolemy 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
3 鏡像使用
列出鏡像列表我們可以使用 docker images 來列出本地主機上的鏡像。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 11 months ago 348.8 MB
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創建時間
SIZE:鏡像大小
獲取一個新的鏡像
docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete
23eda618d451: Pull complete
f0be3084efe9: Pull complete
52de432f084b: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10
docker pull:Docker 用于從鏡像倉庫拉取鏡像的命令。其作用是將指定的鏡像從遠程倉庫(默認是 Docker Hub)下載到本地主機,以便后續基于該鏡像創建容器。
ubuntu:要拉取的鏡像名稱,這里指 Docker Hub 上官方的 Ubuntu 操作系統鏡像。
13.10:鏡像的標簽(Tag),用于指定鏡像的具體版本。標簽 13.10 表示 Ubuntu 13.10 版本的系統鏡像。如果不指定標簽,默認會拉取 latest(最新穩定版)標簽的鏡像。
刪除鏡像
docker rmi hello-world
標記鏡像
docker tag nginx:1.23 your-username/nginx:v1
your-username/nginx:v1即你在docker上的倉庫
為本地鏡像添加 Docker Hub 標簽(推送前標記)
從容器創建一個新的鏡像
# 1. 啟動一個容器并安裝 vim
docker run -it ubuntu:20.04 bash
root@container# apt-get update && apt-get install -y vim
root@container# exit# 2. 查看容器 ID
docker ps -a # 記錄容器 ID(如 a1b2c3d4)# 3. 創建新鏡像(添加作者和描述)
docker commit -a "John Doe" -m "Added vim editor" a1b2c3d4 my-ubuntu:with-vim# 4. 驗證新鏡像
docker images my-ubuntu
保存鏡像
docker save # 將指定鏡像保存成 tar 歸檔文件。
docker save -o mynginx.tar mynginx:v1# 解壓文件,查看內容
tar vxf mynginx.tar -C mynginx
導出鏡像
docker load #導入使用 docker save 命令導出的鏡像。
docker load -i mynginx.tar
使用場景
離線環境部署
在沒有網絡的環境中,通過 save 導出鏡像到 U 盤等存儲設備,再通過 load 導入到目標機器。
bash
在開發環境導出
docker save myapp:v1 -o myapp.tar
在生產環境(無網絡)導入
docker load -i myapp.tar
鏡像備份與還原
定期備份重要鏡像,避免因環境故障導致鏡像丟失。
備份所有鏡像
docker save $(docker images -q) -o all-images.tar# 還原鏡像(需逐個加載)
docker load -i all-images.tar
導出和導入容器
導出容器
ffmpeg@BF-202404020446:~$ docker export 3bd1d669bf6d > ./test_docker/hello_world.tar
ffmpeg@BF-202404020446:~$ cd test_docker/
ffmpeg@BF-202404020446:~/test_docker$ ll
total 28
drwxrwxr-x 2 ffmpeg ffmpeg 4096 May 14 15:50 ./
drwxr-xr-x 16 ffmpeg ffmpeg 4096 May 14 15:49 ../
-rw-rw-r-- 1 ffmpeg ffmpeg 17920 May 14 15:51 hello_world.tar
ffmpeg@BF-202404020446:~/test_docker$
導入容器快照為鏡像
ffmpeg@BF-202404020446:~$ cat ./test_docker/hello_world.tar |docker import - ubuntu:latest
sha256:e38d351585e7265c7da0327d79fa76f1c9eaa0bdac797f7e04124e1ae7bd58e2
第一部分
cat:讀取文件內容并輸出到標準輸出(stdout)
./test_docker/hello_world.tar:指定要讀取的 tar 包路徑
第二部分
docker import:Docker 內置命令,用于從歸檔文件創建鏡像
-:使用標準輸入(stdin)作為輸入源(接收前面管道的輸出)
test/ubuntu:v1:指定導入后的鏡像名稱和標簽(格式:倉庫名/鏡像名:標簽)
4 倉庫操作
登錄
docker login : 登陸到一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub
docker logout : 登出一個Docker鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub
docker login -u 用戶名 -p 密碼
docker logout
拉取鏡像
docker pull nginx
搜索鏡像
docker search ubuntu
推送鏡像
$ docker tag ubuntu:18.04 username/ubuntu:18.04 # 標記倉庫
$ docker image lsREPOSITORY TAG IMAGE ID CREATED ...
ubuntu 18.04 275d79972a86 6 days ago ...
username/ubuntu 18.04 275d79972a86 6 days ago ...
$ docker push username/ubuntu:18.04 # 推送遠程
$ docker search username/ubuntuNAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu