Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker得系统信息,包括镜像和容器得数量
docker 命令 --help #万能命令
镜像命令
docker images 查看所有本地的主机上的镜像
[root@iZbp17prsnk785pvagnbe5Z ~]# docker image
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest aa4d65e670d6 2 months ago 105MB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
[root@iZbp17prsnk785pvagnbe5Z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11490 [OK]
mariadb MariaDB Server is a high performing open sou… 4357 [OK]
#可选项
--filter=STARS=3000 搜索出来的镜像的STARS大于3000
docker pull 下载镜像
#下载镜像 docker pull 镜像名[:tag]
[root@iZbp17prsnk785pvagnbe5Z ~]# docker pull mysql
docker rmi 删除镜像
[root@iZbp17prsnk785pvagnbe5Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest aa4d65e670d6 2 months ago 105MB
nginx latest 08b152afcfae 2 months ago 133MB
mysql latest 95db2e2bd882 2 months ago 514MB
centos latest 300e315adb2f 9 months ago 209MB
# 根据指定id删除镜像
[root@iZbp17prsnk785pvagnbe5Z ~]# docker images -f 镜像id 镜像id ...
# 删除所有镜像
[root@iZbp17prsnk785pvagnbe5Z ~]# docker images -f ${docker images -aq}
容器命令
拉取镜像
docker pull centos
新建容器并启动
docker run [可选参数] 镜像IMAGE ID|镜像REPOSITORY
# 参数说明
--name="Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
[root@iZbp17prsnk785pvagnbe5Z ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest aa4d65e670d6 2 months ago 105MB
nginx latest 08b152afcfae 2 months ago 133MB
mysql latest 95db2e2bd882 2 months ago 514MB
centos latest 300e315adb2f 9 months ago 209MB
# 启动并进入容器
[root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it centos /bin/bash
[root@c9c84bcef44c /]# ls #查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@c9c84bcef44c /]# exit
exit
# 退出容器
exit #直接容器停止退出
ctrl + p + q #容器不停止退出
列出运行中的容器
docker ps 命令
# 参数说明
-a 列出当前正在运行的容器+历史运行过的容器
-n=? 显示最近创建的容器
-q 只显示容器id
[root@iZbp17prsnk785pvagnbe5Z /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZbp17prsnk785pvagnbe5Z /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9c84bcef44c centos "/bin/bash" 6 minutes ago Exited (0) 3 minutes ago recursing_ptolemy
# 模糊查询启动的容器
[root@iZbp17prsnk785pvagnbe5Z /]# docker ps -a |grep cen
3f9faf742893 centos "/bin/bash -c 'while…" 3 minutes ago Up 3 minutes centos
删除容器
docker rm 容器id #删除指定容器,但不能删除运行中的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止容器
常用其他命令
后台启动容器
# 命令
[root@iZbp17prsnk785pvagnbe5Z /]# docker run -d centos
# docker容器使用后台运行,就必须要有一个前台进程,如果没有就自动停止
查看日志
docker logs -f -t --tail 1000 容器id
# 编写一个shell脚本打印日志
[root@iZbp17prsnk785pvagnbe5Z /]# docker run -d --name=centos centos /bin/bash -c "while true;do echo brandon;sleep 2;done"
[root@iZbp17prsnk785pvagnbe5Z /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f9faf742893 centos "/bin/bash -c 'while…" 4 seconds ago Up 3 seconds centos
[root@iZbp17prsnk785pvagnbe5Z /]# docker logs -f centos
brandon
brandon
[root@iZbp17prsnk785pvagnbe5Z /]# docker logs -f -t --tail 5 centos
2021-10-03T04:19:47.165048409Z brandon
2021-10-03T04:19:49.168202492Z brandon
2021-10-03T04:19:51.171283772Z brandon
2021-10-03T04:19:53.174755121Z brandon
2021-10-03T04:19:55.177780172Z brandon
查看容器中的进程信息
docker top 容器id
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器修改一些配置
# 命令
docker exec -it 容器id /bin/bash
[root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos /bin/bash
[root@3f9faf742893 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
[root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos /bin/bash
[root@3f9faf742893 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@3f9faf742893 /]# cd home
[root@3f9faf742893 home]# ls
[root@3f9faf742893 home]# touch hello.txt
[root@3f9faf742893 home]# ls
hello.txt
[root@3f9faf742893 home]# exit
exit
[root@iZbp17prsnk785pvagnbe5Z /]# docker cp centos:/home/hello.txt /home
[root@iZbp17prsnk785pvagnbe5Z /]# cd home
[root@iZbp17prsnk785pvagnbe5Z home]# ls
admin hello.txt
# 拷贝是一个手动过程,未来使用 -v 卷的技术,可以实现自动同步
小结
作业练习
Nginx
[root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=nginx -p 3344:80 nginx
[root@iZbp17prsnk785pvagnbe5Z home]# curl localhost:3344
<!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>
Tomcat
# 官方的使用,加上 --rm 一般用来测试,用完立即删除
docker run -it --rm tomcat:9.0
# 自己,下载再启动
[root@iZbp17prsnk785pvagnbe5Z opt]# docker run -d --name=tomcat -p 3344:8080 tomcat:9.0
# 进入容器
[root@iZbp17prsnk785pvagnbe5Z opt]# docker exec -it tomcat /bin/bash
# 发现1.linux命令少了,2.没有webapps。
# 阿里云镜像默认是最小的镜像,会剔除掉不必要的东西。保证最小可运行的环境。
ES+Kibana
# es暴露的端口很多
# es十分耗内存
# es的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置
# 启动ES
docker run -d --name es --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动后linux变卡了 docker stats 查看cpu的状态
# 测试是否启动成功
[root@iZbp17prsnk785pvagnbe5Z opt]# curl localhost:9200
{
"name" : "110b729878b4",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "R4OKQCETSi2F_mTEyMorBg",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 增加内存限制,修改配置文件 -e 环境配置修改
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
可视化
-
Docker镜像讲解
镜像是什么
分层理解
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
实战测试
启动一个默认的tomcat
# 发现默认的tomcat是没有webapps应用
# 自己拷贝进去文件
# 将操作过的容器通过commit提交为一个镜像容器数据卷
使用数据卷
方式一:直接使用命令来挂载 -v ```powershell docker run -it -v 主机目录:容器内目录
[root@iZbp17prsnk785pvagnbe5Z home]# docker run -it —name=centos -v /home/ceshi:/home centos /bin/bash
启动之后我们可以通过 docker insepct 容器id 来查看容器详情
双向同步
![image.png](https://cdn.nlark.com/yuque/0/2021/png/21580132/1633789949877-c0a714b4-5996-4a06-a770-78cc8c244aa3.png#clientId=uc804887a-8a0f-4&from=paste&height=193&id=u8896a5cf&margin=%5Bobject%20Object%5D&name=image.png&originHeight=385&originWidth=906&originalType=binary&ratio=1&size=42296&status=done&style=none&taskId=u2081738e-8e0e-4470-bac5-bc28d056f88&width=453)
<a name="pYwfk"></a>
### 实战:安装MySQL
思考:MySQL的数据持久化问题
```powershell
# 运行容器,需要数据挂载
# 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动MySQL
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql01 -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
# 阿里云防火墙允许3306端口暴露,Navicat连接成功。
具名和匿名挂载
# 匿名挂载
docker run -d -P --name=nginx01 -v /etc/nginx nginx
# 查看所有卷的情况
[root@iZbp17prsnk785pvagnbe5Z /]# docker volume ls
DRIVER VOLUME NAME
local 4b1bc254463977de4afa93ed0a8da25decb084a9109c315db5b0a27ba62d31e4
local 9ffbac76c08bc0c9d46cf4dc0196baa48bb6f13422dcf1f209d540eda9c4f242
local 84df32bf77c16256ab4bf821ff9caaefe16517bebae0d8853457b9a5f18e958a
local f2dd68a1e69d12017f86f5c9c5ebc7fa862b800c9a845bf432db51433c372791
# 匿名挂载,我们在 -v 只写了容器内的路径,没有容器外的路径!
# 具名挂载
-v 卷名:容器内路径
[root@iZbp17prsnk785pvagnbe5Z /]# docker run -d -P --name=nginx02 -v juming:/etc/nginx nginx
d33d02ceaf36e5f2e34ba738cb5e523c506b69e16b608e1c3614082b7bcdd4fd
[root@iZbp17prsnk785pvagnbe5Z /]# docker volume ls
DRIVER VOLUME NAME
local 4b1bc254463977de4afa93ed0a8da25decb084a9109c315db5b0a27ba62d31e4
local 9ffbac76c08bc0c9d46cf4dc0196baa48bb6f13422dcf1f209d540eda9c4f242
local 84df32bf77c16256ab4bf821ff9caaefe16517bebae0d8853457b9a5f18e958a
local f2dd68a1e69d12017f86f5c9c5ebc7fa862b800c9a845bf432db51433c372791
local juming
[root@iZbp17prsnk785pvagnbe5Z etc]# docker volume inspect juming
[
{
"CreatedAt": "2021-10-04T22:58:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data",
"Name": "juming",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下的都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /主机路径:容器内路径 #指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了。
docker run -d -P --name=nginx02 -v juming:/etc/nginx:ro nginx
docker run -d -P --name=nginx02 -v juming:/etc/nginx:rw nginx
# ro 只要看到,就说明这个路径只能通过主机来操作,容器内部无法操作
初识DockerFile
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
# 创建一个dockerfile文件
[root@iZbp17prsnk785pvagnbe5Z docker-test-volume]# vim dockerfile1
# 文件中的指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end------"
CMD /bin/bash
# 每个命令都是镜像的一层!
[root@iZbp17prsnk785pvagnbe5Z docker-test-volume]# docker build -f dockerfile1 -t brandon/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 32bca8843967
Removing intermediate container 32bca8843967
---> f1e3940784fd
Step 3/4 : CMD echo "------end------"
---> Running in 6ee387c024c9
Removing intermediate container 6ee387c024c9
---> 0866e4790e90
Step 4/4 : CMD /bin/bash
---> Running in 6f7c42333990
Removing intermediate container 6f7c42333990
---> 4029bd2fdf5c
Successfully built 4029bd2fdf5c
Successfully tagged brandon/centos:1.0
启动自己的镜像
红框中这个目录就是我们生成镜像的时候自动挂载的,数据卷目录。这个卷和外部一定有一个同步的目录!
用 docker inspect 容器id 查看
数据卷容器
[root@iZbp17prsnk785pvagnbe5Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
brandon/centos 1.0 4029bd2fdf5c 9 hours ago 209MB
tomcat01 1.0 98e5d7ff833c 20 hours ago 685MB
tomcat 9.0 86783bb5af6c 5 days ago 680MB
redis latest aa4d65e670d6 2 months ago 105MB
nginx latest 08b152afcfae 2 months ago 133MB
mysql latest 95db2e2bd882 2 months ago 514MB
centos latest 300e315adb2f 10 months ago 209MB
elasticsearch 7.6.2 f29a1ee41030 18 months ago 791MB
[root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it --name=centos01 brandon/centos:1.0 /bin/bash
[root@8f32e1e7fa67 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Oct 5 00:47 dev
drwxr-xr-x 1 root root 4096 Oct 5 00:47 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 2020 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 108 root root 0 Oct 5 00:47 proc
dr-xr-x--- 2 root root 4096 Dec 4 2020 root
drwxr-xr-x 11 root root 4096 Dec 4 2020 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Oct 4 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
drwxr-xr-x 20 root root 4096 Dec 4 2020 var
drwxr-xr-x 2 root root 4096 Oct 5 00:47 volume01
drwxr-xr-x 2 root root 4096 Oct 5 00:47 volume02
# 启动02
[root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it --name=centos02 --volumes-from centos01 brandon/centos:1.0
# 切换窗口进入01
[root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos01 /bin/bash
[root@8f32e1e7fa67 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@8f32e1e7fa67 /]# cd volume01/
[root@8f32e1e7fa67 volume01]# ls
[root@8f32e1e7fa67 volume01]# touch 1.txt
# 进入02查看
[root@9fddee554348 /]# cd volume01
[root@9fddee554348 volume01]# ls
1.txt
多个mysql实现数据共享
[root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql01 -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
[root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql02 -p 3306:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
DockerFile
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须大写字母
2、执行从上倒下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维
DockerFile:构建文件,定义了一切步骤,源代码
DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口
CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENREYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的命令。触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试
DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建
```powershell自己创建一个centos
1、编写dockerfile文件
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# vim myDockerfile-centos FROM centos MAINTAINER ht123456@163.com
ENV MYPATH /usr/local WORKDIR $MYPATH
RUN yum -y install vim RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH CMD echo “——-end——-“ CMD /bin/bash
2、通过文件构建镜像
-f dockerfile文件路径
-t 镜像名:[tag]
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f myDockerfile-centos -t myCentos:0.1 .
3、测试运行
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run -it mycentos:0.1
[root@3c05a4ede375 local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@3c05a4ede375 local]# pwd
/usr/local
[root@3c05a4ede375 local]# ifconfig
eth0: flags=4163
lo: flags=73
[root@3c05a4ede375 local]# vim
```powershell
# docker histor 查看镜像构建过程
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker history mycentos:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
e02d32c971ae 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
a95443209d9d 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
6a91279aa4af 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
8f004616c44d 13 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
97cd9849e33a 13 minutes ago /bin/sh -c yum -y install net-tools 32MB
92231ce8678b 13 minutes ago /bin/sh -c yum -y install vim 72MB
27183ac7cf30 14 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6830ab186be6 14 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
163cc5d4450f 14 minutes ago /bin/sh -c #(nop) MAINTAINER ht<123456@163.… 0B
300e315adb2f 10 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 10 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 10 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD和ENTRYPOINT的区别
CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENREYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
# 测试CMD
# 编写dockerfile文件
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]
# 构建镜像
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:0.1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls", "-a"]
---> Running in da7aae00d569
Removing intermediate container da7aae00d569
---> 60eece1c0705
Successfully built 60eece1c0705
Successfully tagged cmdtest:0.1
# 运行镜像,发现 ls -a 生效
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run -it cmdtest:0.1
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
# 想追加一个命令 -l ls -al
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run cmdtest:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
# CMD命令下,-l 替换了CMD["ls","-a"]命令,-l不是命令所有报错。
# 测试ENTRYPOINT
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f dockerfile-entrypoint-test -t entrytest:0.1 .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in cda4cc709a62
Removing intermediate container cda4cc709a62
---> 5f93349de81f
Successfully built 5f93349de81f
Successfully tagged entrytest:0.1
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run entrytest:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 追加的命令,是直接拼接在ENTRYPOINT命令的后面
[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run entrytest:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 Oct 5 12:48 .
drwxr-xr-x 1 root root 4096 Oct 5 12:48 ..
-rwxr-xr-x 1 root root 0 Oct 5 12:48 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Oct 5 12:48 dev
drwxr-xr-x 1 root root 4096 Oct 5 12:48 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 2020 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 107 root root 0 Oct 5 12:48 proc
dr-xr-x--- 2 root root 4096 Dec 4 2020 root
drwxr-xr-x 11 root root 4096 Dec 4 2020 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Oct 4 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
drwxr-xr-x 20 root root 4096 Dec 4 2020 var
DockerFile中很多命令都十分相似。
实战:部署node服务
$ vim Dockerfile
FROM node:latest
RUN mkdir -p /home/www/express
WORKDIR /home/www/express
COPY . /home/www/express
RUN npm install
EXPOSE 3000
ENTRYPOINT ["npm", "run"]
CMD ["start"]
这个文件包含了以下命令:
- FROM node:latest - 指定使用最新版本的node基础镜像
- RUN mkdir -p /home/www/express - 在容器内创建/home/www/express目录
- WORKDIR /home/www/express - 将容器内工作目录设置为/home/www/express
- COPY . /home/www/express - 将宿主机当前目录下内容复制到镜像/home/www/express目录下
- RUN npm install - npm install安装应用所需的NPM包
- EXPOSE 3000 - 对外开放容器的3000端口
- ENTRYPOINT [“npm”, “run”] - 容器启动后执行的命令。不可被docker run提供的参数覆盖
- CMD [“start”] - 在容器启动时,执行的命令,可被docker run提供的参数覆盖
```powershell
将镜像命名为test/express
docker build -t test/express .
运行容器
docker run -d —name experss-app -p 3000:3000 test/express
<a name="Xdf8k"></a>
## 实战:Tomcat镜像
1、准备镜像文件 tomcat 压缩包,jdk的压缩包<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21580132/1633790752863-486478c6-7a31-457c-a99f-629a99066702.png#clientId=uc804887a-8a0f-4&from=paste&height=39&id=u27f44029&margin=%5Bobject%20Object%5D&name=image.png&originHeight=78&originWidth=683&originalType=binary&ratio=1&size=9775&status=done&style=none&taskId=ua0661ea4-9497-464a-8df6-d16cbe201c6&width=341.5)<br />2、编写Dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了。
```powershell
FROM centos
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.54.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.54
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
3、构建镜像
[root@iZbp17prsnk785pvagnbe5Z tomcat]# docker build -t diytomcat:1.0 .
4、启动自建镜像
[root@iZbp17prsnk785pvagnbe5Z tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat 1.0 51860abc46cf 2 minutes ago 621MB
[root@iZbp17prsnk785pvagnbe5Z tomcat]# docker run -d -p 9090:8080 --name=diytomcat -v /home/dockerfile/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps -v /home/dockerfile/tomcat/logs:/usr/local/apache-tomcat-9.0.54/logs diytomcat:1.0
发布自己的镜像
1、登录阿里云
2、进入容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览阿里云
$ docker login --username=程序猿没有春天 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]
$ docker pull registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]