Docker基本命令
Docker基本命令
Docker常用命令
啟動 Docker
systemctl start docker
在服務(wù)器關(guān)機(jī)或者重啟后,是需要重新啟動 Docker 的。 命令如下:
systemctl start docker
查看日志
docker logs
語法
docker logs [參數(shù)] 容器
參數(shù)
f:日志流動輸出。t:展示時間戳。-tail:從日志末尾顯示的行數(shù)。
為模擬日志輸出效果,我們先編寫一段腳本
while true;do echo sail;sleep 3;done
以上腳本實現(xiàn)的效果為:每隔 3 秒輸出字符串 sail。
以腳本啟動容器
[root@sail ~]# docker logs -f -t --tail 10 c3d59f55d600
2021-12-10T03:01:28.607288480Z sail
2021-12-10T03:01:31.609334595Z sail
2021-12-10T03:01:34.611361943Z sail
2021-12-10T03:01:37.613461457Z sail
2021-12-10T03:02:10.636760025Z sail
可以看到,按此命令會看到容器最后 10 條日志,且每隔 3 秒滾動輸出一條日志。
后臺啟動
docker run -d
語法
docker run -d 鏡像
后臺啟動鏡像
[root@sail ~]# docker run -d centos
0aee6f74b913f120195ca323892867bba7d72f2671f2f8b17278a3e029ad5bfd
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
使用 docker run -d 啟動,也并不能保證容器一定能在后臺運(yùn)行,如果沒有前臺使用,容器啟動后發(fā)現(xiàn)自己沒有提供服務(wù),會立刻停止。
前面的 docker run -d centos /bin/sh -c "while true;do echo sail;sleep 3;done" 命令,由于啟動后運(yùn)行了腳本打印日志,即提供了服務(wù),所以不會停止。
查看容器信息
docker inspect
語法
docker inspect 容器
示例
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3d59f55d600 centos "/bin/sh -c 'while t…" 24 minutes ago Up 5 seconds musing_poincare
[root@sail ~]# docker inspect c3d59f55d600
[.....]
不管容器是否運(yùn)行,都可以使用該命令查看。
進(jìn)入正在運(yùn)行的容器
容器是一個微型的 Linux 系統(tǒng),我們通常需要進(jìn)入容器進(jìn)行操作。
docker exec
使用 docker exec 可以進(jìn)入容器并開啟一個新的終端,可以在里面操作。
語法
docker exec [參數(shù)] 容器 路徑
參數(shù)
d:后臺運(yùn)行。it:交互模式進(jìn)入。
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96ed3fe3e7f1 centos "/bin/bash" 15 hours ago Up 15 hours centos01
[root@sail ~]# docker exec -it 96ed3fe3e7f1 /bin/bash
[root@96ed3fe3e7f1 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@96ed3fe3e7f1 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec09 pts/0 00:00:00 /bin/bash
root 15 0 0 03:38 pts/1 00:00:00 /bin/bash
root 30 15 0 03:39 pts/1 00:00:00 ps -ef
這種進(jìn)入方式是單獨(dú)開了一個新進(jìn)程的方式。
docker attach
使用 docker attach 會進(jìn)入容器正在執(zhí)行的終端,不會啟動新的進(jìn)程。
語法 docker attach 容器
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96ed3fe3e7f1 centos "/bin/bash" 17 hours ago Up 17 hours centos01
[root@sail ~]# docker attach 96ed3fe3e7f1
[root@96ed3fe3e7f1 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec09 pts/0 00:00:00 /bin/bash
root 33 1 0 05:49 pts/0 00:00:00 ps -ef
這種進(jìn)入方式?jīng)]有開啟新的進(jìn)程(/bin/bash 是 centos 容器的默認(rèn)終端)。
從容器內(nèi)拷貝文件到主機(jī)
查看啟動的容器
[root@sail ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96ed3fe3e7f1 centos "/bin/bash" 17 hours ago Up 17 hours centos01
進(jìn)入容器,創(chuàng)建一個文件
[root@sail ~]# docker attach 96ed3fe3e7f1
[root@96ed3fe3e7f1 /]# cd /home
[root@96ed3fe3e7f1 home]# touch test.java
[root@96ed3fe3e7f1 home]# ls
test.java
[root@96ed3fe3e7f1 home]# exit
exit
退出容器后,不管容器是否啟動,都可以復(fù)制容器中的文件到主機(jī)上
[root@sail ~]# cd /home
[root@sail home]# docker cp 96ed3fe3e7f1:/home/test.java /home
[root@sail home]# ls
admin f2 f3 sail test.java
這種方式是一個手動過程,很不方便,推薦使用數(shù)據(jù)卷技術(shù),可以實現(xiàn)自動同步主機(jī)和容器的目錄。
查看Docker內(nèi)存占用
docker stats
語法
docker stats [參數(shù)] [容器...]
參數(shù)
a:查看所有容器的內(nèi)存占用(默認(rèn)只展示運(yùn)行的容器)。
[root@sail home]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
96ed3fe3e7f1 centos01 0.00% 524KiB / 1.694GiB 0.03% 0B / 0B 0B / 0B 1
[root@sail home]# docker stats -a
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0aee6f74b913 brave_rosalind 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
c3d59f55d600 musing_poincare 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
569026bc0955 centos03 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
71a97b830ec5 centos02 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
96ed3fe3e7f1 centos01 0.00% 524KiB / 1.694GiB 0.03% 0B / 0B 0B / 0B 1
Docker部署
部署Nginx
下載鏡像
[root@sail home]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
e5ae68f74026: Pull complete
21e0df283cd6: Pull complete
ed835de16acd: Pull complete
881ff011f1c9: Pull complete
77700c52c969: Pull complete
44be98c0fab6: Pull complete
Digest: sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看鏡像
[root@sail home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f652ca386ed1 7 days ago 141MB
運(yùn)行鏡像
[root@sail home]# docker run -d --name=nginx01 -p 3344:80 nginx
f58fb3ed8c5587d2c28567c865759438e449f2fd65889f2910286b9cd74debec
[root@sail home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f58fb3ed8c55 nginx "/docker-entrypoint.…" 23 seconds ago Up 22 seconds 0.0.0.0:3344->80/tcp nginx01
測試驗證
使用 curl 命令可以模擬網(wǎng)頁訪問,以此來測試 Nginx 啟動情況。
[root@sail home]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
外網(wǎng)訪問測試
如果是使用阿里云服務(wù)器,需要先開啟端口。

使用阿里云的公網(wǎng) IP 即可進(jìn)行訪問。

出現(xiàn)此頁面,即代表 Nginx 部署成功。
查看啟動的容器
[root@sail home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f58fb3ed8c55 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:3344->80/tcp nginx01
查看容器中 Nginx 目錄
[root@sail home]# docker exec -it nginx01 /bin/bash
root@f58fb3ed8c55:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f58fb3ed8c55:/# cd /etc/nginx
root@f58fb3ed8c55:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
如此,如果需要修改 Nginx 的配置即可修改 nginx.conf 文件實現(xiàn)。
不過如果每次修改都要進(jìn)入容器后再進(jìn)行操作,是很繁瑣的事,還是更推薦使用容器卷技術(shù)。
部署原理

部署Tomcat
啟動Tomcat
[root@sail bin]# docker run -d -p 8080:8080 --name=tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
5e0b432e8ba9: Pull complete
a84cfd68b5ce: Pull complete
e8b8f2315954: Pull complete
0598fa43a7e7: Pull complete
e0d35e3be804: Pull complete
8fc448a0c88b: Pull complete
dbdff6e5955b: Pull complete
5daf3771e3d8: Pull complete
e4265b3badfc: Pull complete
126f233cb97a: Pull complete
Digest: sha256:429d5c140820d5eba38042823501d5f4e0f03b282133513e29c22d6358daa7c7
Status: Downloaded newer image for tomcat:latest
fe247e0ef80de961df2f73216b3c604d97094b9a35064f9bef421243e610e487
[root@sail bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe247e0ef80d tomcat "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp tomcat01
這里選擇直接啟動的方式,若本地沒有該鏡像,則先從官方庫拉取。
進(jìn)入容器
[root@sail sail]# docker exec -it tomcat01 /bin/bash
root@fe247e0ef80d:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@fe247e0ef80d:/usr/local/tomcat# cd webapps
root@fe247e0ef80d:/usr/local/tomcat/webapps# ls
root@fe247e0ef80d:/usr/local/tomcat/webapps#
這里發(fā)現(xiàn)一個問題,Tomcat 下的 webapps 沒有文件,所以 Tomcat 的初始頁面是不能顯示的。
這也是 Docker 的精髓,只保留最核心的東西,剔除所有不必要的內(nèi)容。
這也并非不可解決,webapps 的默認(rèn)內(nèi)容是存放在 webapps.dist 中的
root@fe247e0ef80d:/usr/local/tomcat# cd webapps.dist
root@fe247e0ef80d:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
將 webapps.dist 中的內(nèi)容復(fù)制到 webapps 下
root@fe247e0ef80d:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@fe247e0ef80d:/usr/local/tomcat# cd webapps
root@fe247e0ef80d:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
外網(wǎng)訪問測試

命令測試
root@fe247e0ef80d:/usr/local/tomcat/webapps# ll
bash: ll: command not found
這里又發(fā)現(xiàn)一個問題,ll 這種相對基礎(chǔ)的命令也是沒有的,如此也可以看出 Docker 極致的精簡。

浙公網(wǎng)安備 33010602011771號