Docker操作命令实战
基本命令
docker version # 显示docker的版本信息
docker info # 显示docker的具体信息, 包括镜像和容器的数量
docker 命令 --help # 帮助命令
帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/
镜像命令
docker images # 查看本地主机上的镜像
[chenkai@centos7 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0 aa27923130e6 3 weeks ago 98.4MB
# 解释
REPOSITORY # 镜像的仓库源
TAG # 标签
IMAGE ID # 镜像ID
CREATED # 创建时间
SIZE # 大小
# 可选项
Options:
-a, --all Show all images (default hides intermediate images) # 列出所有镜像
--digests Show digests # 格式化
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs # 只显示镜像的ID
# 常用: 显示所有镜像的ID
docker images -aq
docker search # 搜索镜像
[chenkai@centos7 ~]$ docker search mysql
# 可选项, 通过条件过滤搜索想要的
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
--filter=STARS=3000 # 搜索点赞数量大于3000的镜像源(stars忽略大小写)
[chenkai@centos7 ~]$ docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10247 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3785 [OK]
docker pull # 下载镜像
[chenkai@centos7 ~]$ docker pull mysql
Using default tag: latest # 默认下载最新版本
# 通过 : (冒号) 指定版本
[chenkai@centos7 ~]$ docker pull mysql:5.7
5.7: Pulling from library/mysql
# docker会使用分层下载, 这是docker image的核心 (联合文件系统)
docker rmi # 删除镜像
[chenkai@centos7 ~]$ docker rmi ae0658fdbad5
# 删除所有镜像(-f[force] 表示强制)
[chenkai@centos7 ~]$ docker rmi -f $(docker images -aq)
# 使用 xargs 命令实现删除所有镜像
[chenkai@centos7 ~]$ docker images -aq | xargs docker rmi -f
容器命令
有了镜像之后才可以运行容器, 我们下载一个 centos 镜像测试一下
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="container_name" # 容器名字,例如tomcat1, tomcat2, 用来区分容器
-i # 保持容器运行
-d # 后台守护方式运行
-it # 使用交互方式运行, 进入容器查看内容
-p # 指定容器的端口,例如 8080:8080 前面是宿主机器端口
-P # 大P, 随机指定端口
# 测试, 启动并进入容器
[chenkai@centos7 ~]$ docker run -it centos /bin/bash
[root@fc8b9409f4d8 /]#
退出容器
[root@538f6e2e1f8a /]# exit
exit # 直接容器停止, 并退出
[chenkai@centos7 ~]$
ctrl + p + q # 退出之后, 容器仍在运行
[chenkai@centos7 ~]$ docker run -it centos /bin/bash
[root@62c27b2cc4b3 /]#
[root@62c27b2cc4b3 /]# [chenkai@centos7 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62c27b2cc4b3 centos "/bin/bash" 13 seconds ago Up 11 seconds magical_galileo
docker ps # 查看容器
# docker ps [可选参数]
-a # 所有容器
-n # 指定数量的容器信息
-q # 只显示容器ID
# 查看正在运行中的容器信息
[chenkai@centos7 ~]$ docker ps
# 查看所有容器信息(包括已经停止的容器)
[chenkai@centos7 ~]$ docker ps -a
# 根据创建时间输出最近的 n 个容器信息(包括已经停止的容器)
[chenkai@centos7 ~]$ docker ps -n=3
docker rm # 删除容器
docker rm 容器ID # 不能删除正在运行中的容器, 强制删除需要加 -f 参数
# 删除所有容器(-f[force] 表示强制)
[chenkai@centos7 ~]$ docker rm -f $(docker ps -aq)
# 使用 xargs 命令实现删除所有容器
[chenkai@centos7 ~]$ docker ps -aq | xargs docker rm -f
启动和停止容器的操作
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID # 强制停止容器
进入当前正在运行的容器
# 我们通常容器都是后台方式运行的, 需要进入容器, 修改一些配置
# 方式1 (进入容器后, 开启一个新的终端, 可以在里面进行操作)
docker exec -it 容器ID /bin/bash
# 方式2 (进入容器正在执行的终端, 不会启动新的进程)
docker attach 容器ID
常用其他命令
后台启动容器
# 命令: docker run -d 镜像名
[chenkai@centos7 ~]$ docker run -d centos /bin/bash
# 问题: docker ps, 发现 centos 停止了
# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程, docker 发现没有应用, 就会自动停止
# nginx 容器启动后, 发现自己没有启动服务, 就会立刻停止, 就是没有程序了...
查看日志
# 查看最后 10 条日志, -f 是 follow, -t 是timestamps 时间戳, 也可以写成 -tf
docker logs -f -t --tail 10 容器ID
# 动态显示所有日志
docker logs -f -t 容器ID
# demo
[chenkai@centos7 ~]$ docker run -d centos /bin/bash -c "while true; do echo kaichenkai; sleep 1; done"
0c36e7a02175d97c371b754295a93a34ebc0dc94cb20355a7bbc4ac0b2b7485a
[chenkai@centos7 ~]$
[chenkai@centos7 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c36e7a02175 centos "/bin/bash -c 'while…" 5 seconds ago Up 4 seconds trusting_aryabhata
[chenkai@centos7 ~]$ docker logs -f -t --tail 10 0c36
2020-12-13T13:32:52.898576651Z kaichenkai
2020-12-13T13:32:53.900576323Z kaichenkai
2020-12-13T13:32:54.902584598Z kaichenkai
2020-12-13T13:32:55.905237048Z kaichenkai
2020-12-13T13:32:56.907263964Z kaichenkai
2020-12-13T13:32:57.909457535Z kaichenkai
2020-12-13T13:32:58.911857015Z kaichenkai
2020-12-13T13:32:59.913973956Z kaichenkai
查看容器中的进程信息
# 命令: docker top 容器ID
# demo
[chenkai@centos7 Desktop]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c36e7a02175 centos "/bin/bash -c 'while…" 20 minutes ago Up 20 minutes trusting_aryabhata
[chenkai@centos7 Desktop]$ docker top 0c36
UID PID PPID C STIME TTY TIME CMD
root 5910 5889 0 08:32 ? 00:00:00 /bin/bash -c while true; do echo kaichenkai; sleep 1; done
root 9461 5910 0 08:53 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
从容器内拷贝文件到宿主机器上
docker cp 容器id:容器内路径 宿主机器路径
# demo (注意空格)
[chenkai@centos7 ~]$ docker cp fd17070accec:/test/test.py ~/
[chenkai@centos7 ~]$ ll
total 4
drwxr-xr-x. 5 chenkai chenkai 184 Dec 13 08:54 Desktop
drwxr-xr-x. 2 chenkai chenkai 6 Sep 8 2019 Documents
drwxr-xr-x. 2 chenkai chenkai 30 Dec 10 02:06 Downloads
drwxr-xr-x. 2 chenkai chenkai 6 Sep 8 2019 Music
drwxr-xr-x. 3 chenkai chenkai 44 Sep 11 2019 Pictures
drwxr-xr-x. 2 chenkai chenkai 6 Sep 8 2019 Public
drwxr-xr-x. 2 chenkai chenkai 6 Sep 8 2019 Templates
-rw-r--r--. 1 chenkai chenkai 13 Dec 13 09:30 test.py
drwxr-xr-x. 2 chenkai chenkai 6 Sep 8 2019 Videos
# 拷贝是一个手动过程, 需要使用挂载卷的方式来实现
查看容器状态
# 查看容器状态 docker stats 容器ID/容器名称
docker stats elasticsearch 或者 docker stats a23331750011
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a23331750011 elasticsearch 0.25% 349.2MiB / 7.62GiB 4.48% 3.79kB / 0B 0B / 649kB 40
Docker 部署nginx, tomcat 等服务
docker 部署 nginx
# 1. 搜索镜像 search
# 2. 下载镜像 pull
[chenkai@centos7 ~]$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
6ec7b7d162b2: Already exists
bbce32568f49: Pull complete
5928664fb2b3: Pull complete
a85e904c7548: Pull complete
ac39958ca6b1: Pull complete
Digest: sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[chenkai@centos7 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0 5a3c8e192943 3 days ago 98.4MB
nginx latest 7baf28ea91eb 3 days ago 133MB
centos latest 300e315adb2f 7 days ago 209MB
# 3. 运行容器 run
# -d 后台运行守护容器, --name 给容器命名(多个容器分别命名), -p 端口映射 宿主端口:容器内部端口
[chenkai@centos7 ~]$ docker run --name nginx_master -d -p 8080:80 nginx
1238ddbea007cb1b486c9bc7a738fbdac027caa6194977675bcd1205cc06b483
# 4. 端口测试! (需要做端口映射才能访问!)
[chenkai@centos7 ~]$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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>
# 进入容器, 使用 whereis nginx 查找 nginx 配置文件
[chenkai@centos7 ~]$ docker exec -it nginx_master /bin/bash
root@1238ddbea007:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
docker部署tomcat
# 官方的使用
docker run it --rm -p 8080:8080 tomcat:9.0
# 我们之前都是后台启动, 停止了容器之后, 容器还是可以查看到, --rm 参数一般用来测试, 表示用完即删除容器
# 使用下载镜像再启动的方式
docker pull tomcat:9.0
# 启动容器
[chenkai@centos7 ~]$ docker run --name tomcat_master -d -p 8080:8080 tomcat:9.0
# 访问测试(404页面)
[chenkai@centos7 ~]$ curl localhost:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/9.0.41</h3></body></html>
# 进入容器
[chenkai@centos7 ~]$ docker exec -it tomcat_master /bin/bash
root@03e462c2c1c6:/usr/local/tomcat# ll
bash: ll: command not found
root@03e462c2c1c6:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@03e462c2c1c6:/usr/local/tomcat# cd webapps
root@03e462c2c1c6:/usr/local/tomcat/webapps# ls
root@03e462c2c1c6:/usr/local/tomcat/webapps#
# 发现问题:1. linux 命令少了, 2.没有webapps应用, 阿里云镜像的原因, 默认是最小的镜像, 所有不必要的都剔除掉, 保证最小可运行的环境
# 将 webapps.dist 的欢迎页面内容cp到webapps
# root@03e462c2c1c6:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 再次测试访问 curl localhost:8080, 出现欢迎页面, (不会出现404了)
思考问题: 每次要部署项目, 如果每次都要进入容器是不是特别麻烦 ? 要是在容器外面提供一个映射目录 webapps, 我们在外面放置好目录, 就可以自动同步到容器内部了.
docker 部署 ES + Kibana
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录 ~ 挂载卷
# 官方指导文档地址: https://hub.docker.com/_/elasticsearch
# 官方运行容器命令
$ docker network create somenetwork
# --net somenetwork ? 网络配置 ?
$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
# tag: 版本号, 使用 6.6.0
# 运行容器, ES 默认以 1g 内存启动, 如果阿里云服务器内存很小,则会很卡
[chenkai@centos7 ~]$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.6.0
Unable to find image 'elasticsearch:6.6.0' locally
6.6.0: Pulling from library/elasticsearch
a02a4930cb5d: Pull complete
7decffa70b3b: Pull complete
498315b62345: Pull complete
c84790c95eb9: Pull complete
6a3b0a2308b2: Pull complete
33b21a7b5e00: Pull complete
f620bc30e187: Pull complete
Digest: sha256:ed1f27b9a16dc29d19fc607a1e6e281d1ddf83d81734427d895f5b91c23a6ee5
Status: Downloaded newer image for elasticsearch:6.6.0
c6b9c32be5a860b514fe7ba5f5d559e090e546af753054d1c48980d28c4c444e
# 访问测试
[chenkai@centos7 ~]$ curl localhost:9200
{
"name" : "7-em8I4",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "haoHQGn9SsGeoCEASSO7NA",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
# 运行ES容器时, 对内存进行限制(最小64m, 最大512m), 使用 -e 参数
-e ES_JAVA_OPTS="-Xms64m -Xmx512m"
# 指定内存运行容器
[chenkai@centos7 ~]$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:6.6.0
a23331750011eac317d6a263bac8e14cdc05cfafe1f03a6884b0ef0ae652a8d5
# 查看容器状态 docker stats 容器ID/容器名称
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a23331750011 elasticsearch 0.25% 349.2MiB / 7.62GiB 4.48% 3.79kB / 0B 0B / 649kB 40
这里还缺少 kibana6.6.0的安装部署内容
如何提交一个自己的镜像
# 命令与 git 原理类似
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:TAG
# 测试, 以上面tomcat的容器为例, 把 webapps.dist 的欢迎页面内容cp到webapps, 然后提交新的镜像
[chenkai@centos7 ~]$ docker commit -m="有欢迎页面的tomcat容器" -a="chenkai" 03e462c2c1c6 my_tomcat:2.0
sha256:f4fca90d1212033367cab555ab66d04b06e7bed850e7b0faada384123609f9b8
# 查看自己提交的镜像
[chenkai@centos7 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_tomcat 2.0 f4fca90d1212 38 seconds ago
将操作过的容器通过 commit 提交为一个镜像, 以后就可以直接使用修改过的镜像了
将容器提交为镜像, 就好比在 VM 中生成一个当前的快照
完 ~
每天都要遇到更好的自己.