Docker基本命令
Docker基本命令
Docker常用命令
启动 Docker
systemctl start docker
在服务器关机或者重启后,是需要重新启动 Docker 的。 命令如下:
systemctl start docker
查看日志
docker logs
语法
docker logs [参数] 容器
参数
f
:日志流动输出。t
:展示时间戳。-tail
:从日志末尾显示的行数。
为模拟日志输出效果,我们先编写一段脚本
while true;do echo sail;sleep 3;done
以上脚本实现的效果为:每隔 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 启动,也并不能保证容器一定能在后台运行,如果没有前台使用,容器启动后发现自己没有提供服务,会立刻停止。
前面的 docker run -d centos /bin/sh -c "while true;do echo sail;sleep 3;done"
命令,由于启动后运行了脚本打印日志,即提供了服务,所以不会停止。
查看容器信息
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
[.....]
不管容器是否运行,都可以使用该命令查看。
进入正在运行的容器
容器是一个微型的 Linux 系统,我们通常需要进入容器进行操作。
docker exec
使用 docker exec
可以进入容器并开启一个新的终端,可以在里面操作。
语法
docker exec [参数] 容器 路径
参数
d
:后台运行。it
:交互模式进入。
[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
这种进入方式是单独开了一个新进程的方式。
docker attach
使用 docker attach
会进入容器正在执行的终端,不会启动新的进程。
语法 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
这种进入方式没有开启新的进程(/bin/bash
是 centos 容器的默认终端)。
从容器内拷贝文件到主机
查看启动的容器
[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 /]# cd /home
[root@96ed3fe3e7f1 home]# touch test.java
[root@96ed3fe3e7f1 home]# ls
test.java
[root@96ed3fe3e7f1 home]# exit
exit
退出容器后,不管容器是否启动,都可以复制容器中的文件到主机上
[root@sail ~]# cd /home
[root@sail home]# docker cp 96ed3fe3e7f1:/home/test.java /home
[root@sail home]# ls
admin f2 f3 sail test.java
这种方式是一个手动过程,很不方便,推荐使用数据卷技术,可以实现自动同步主机和容器的目录。
详情见:Docker 12 数据卷
查看Docker内存占用
docker stats
语法
docker stats [参数] [容器...]
参数
a
:查看所有容器的内存占用(默认只展示运行的容器)。
[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
运行镜像
[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
命令可以模拟网页访问,以此来测试 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 href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
外网访问测试
如果是使用阿里云服务器,需要先开启端口。
使用阿里云的公网 IP 即可进行访问。
出现此页面,即代表 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 文件实现。
不过如果每次修改都要进入容器后再进行操作,是很繁琐的事,还是更推荐使用容器卷技术。
部署原理
部署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
这里选择直接启动的方式,若本地没有该镜像,则先从官方库拉取。
进入容器
[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#
这里发现一个问题,Tomcat 下的 webapps 没有文件,所以 Tomcat 的初始页面是不能显示的。
这也是 Docker 的精髓,只保留最核心的东西,剔除所有不必要的内容。
这也并非不可解决,webapps 的默认内容是存放在 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 中的内容复制到 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
外网访问测试
命令测试
root@fe247e0ef80d:/usr/local/tomcat/webapps# ll
bash: ll: command not found
这里又发现一个问题,ll 这种相对基础的命令也是没有的,如此也可以看出 Docker 极致的精简。