常用命令
镜像命令
-
docker images # 查看本地镜像
可选项:
-a --all # 全部 -q --quiet # 只输出id -f --filter # 过滤
-
docker search # 搜索镜像
可选项:
-f, --filter # 过滤 --filter=STARS=3000(过滤收藏数为3000的镜像) --format # 格式 --limit # 限制镜像个数
-
docker pull # 下载镜像
# 下载镜像 docker pull 镜像名[:tag] shaoalong@shaoalongdeMacBook-Pro ~ % docker pull nginx Using default tag: latest # tag默认latest latest: Pulling from library/nginx 927a35006d93: Pull complete e9732214ce29: Pull complete 2a43e8ccd0e2: Pull complete 1e7364bb715b: Pull complete 84c9196eeac2: Pull complete eda5549c53cc: Pull complete Digest: sha256:366e9f1ddebdb844044c2fafd13b75271a9f620819370f8971220c2b330a9254 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest # 真实地址 # 等价命令 docker pull nginx docker pull docker.io/library/nginx:latest # 指定版本下载 shaoalong@shaoalongdeMacBook-Pro ~ % docker pull nginx:1.20.2 1.20.2: Pulling from library/nginx 927a35006d93: Already exists 528fa435768c: Pull complete fe7509a021d7: Pull complete 343bcf1bd848: Pull complete 278a43e3d19a: Pull complete 884465ec3660: Pull complete Digest: sha256:d39dfdb90a7ddd1516b6fc3b38da8ffc4a00accb3deeef905f3f02319a3c715f Status: Downloaded newer image for nginx:1.20.2 docker.io/library/nginx:1.20.2
-
docker rmi # 删除镜像
docker rmi -f 容器id/名称 # 删除指定镜像 docker rmi -f 容器id 容器id 容器id # 删除多个镜像 docker rmi -f $(docker images -aq) # 删除全部镜像
容器命令
-
新建容器并启动 docker run
docker run [可选参数] image # 参数说明 --name="Name" # 容器名称用来区分容器 -d # 后台方式运行 -it # 交互方式运行,进入容器查看内容 -p # 指定容器的端口 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P # 随即端口
-
停止并退出容器 exit
-
容器不停止退出 Ctrol + P + Q
-
查看容器 docker ps
# 参数说明 #默认列出当前正在运行的容器 -a # 列出当前正在运行的容器+历史运行过的容器 -n=? # 现实最近创建的容器 -q # 只显示容器编号 # 例子 docker ps -a # 列出当前正在运行的容器+历史运行过的容器 docker ps -a -n=1 # 列出最近一次创建的容器 docker ps -aq # 列出所有容器的id
-
删除容器 docker rm
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,如果强制删除 rm -f docker rm -f $(docker ps -aq) # 删除所有容器
-
启动和停止容器的操作
docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前正在运行的容器
-
查看日志 docker logs
docker logs -ft --tail 容器id
# 编写一段shell脚本 docker run -d centos /bin/bash -c "while true;do echo shaoalong;sleep 1;done" # docker ps CONTAINER ID IMAGE ec2b942da57a centos # 显示日志 -t --timestamps # 时间戳 -f --follow # 显示日志 --tail number # 显示日志条数 docker logs -tf --tail 10 ec2b942da57a
-
查看容器中进程信息 docker top
# docker top 容器id UID PID PPID root 3971 3945 root 4794 3971
-
查看容器的元数据 docker inspect
-
进入当前正在运行的容器 docker exec/attach
docker exec -it 容器id bashShell
shaoalong@shaoalongdeMacBook-Pro ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS ec2b942da57a centos "/bin/bash -c 'while…" 34 minutes ago Up 34 minutes shaoalong@shaoalongdeMacBook-Pro ~ % docker exec -it ec2b942da57a /bin/bash [root@ec2b942da57a /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@ec2b942da57a /]# ps PID TTY TIME CMD 2071 pts/0 00:00:00 bash 2102 pts/0 00:00:00 ps [root@ec2b942da57a /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:37 ? 00:00:02 /bin/bash -c while true;do echo root 2071 0 0 09:11 pts/0 00:00:00 /bin/bash root 2107 1 0 09:12 ? 00:00:00 /usr/bin/coreutils --coreutils-p root 2108 2071 0 09:12 pts/0 00:00:00 ps -ef
docker attach 容器id bashShell
shaoalong@shaoalongdeMacBook-Pro ~ % docker attach ec2b942da57a /bin/bash 正在执行当前终端的代码...
两者的不同
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach # 进入容器正在执行的终端,不会启动新的进程
-
从容器内拷贝文件到宿主机 docker cp
docker cp 容器id:容器内路径 目的宿主机路径
# 查看容器id shaoalong@shaoalongdeMacBook-Pro / % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76cf6e49555b centos "/bin/bash" 5 hours ago Exited (0) 4 minutes ago strange_jones # 开启容器 shaoalong@shaoalongdeMacBook-Pro / % docker start 76cf6e49555b 76cf6e49555b #进入容器 shaoalong@shaoalongdeMacBook-Pro / % docker attach 76cf6e49555b #在容器中创建文件 [root@76cf6e49555b /]# touch /home/test.js # 停止并退出 [root@76cf6e49555b /]# exit exit shaoalong@shaoalongdeMacBook-Pro / % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76cf6e49555b centos "/bin/bash" 5 hours ago Exited (0) 9 seconds ago strange_jones # 拷贝容器文件到主机(只要容器没有被删除,容器内的文件就保留,如果没删除那么所有文件都被清空) shaoalong@shaoalongdeMacBook-Pro / % docker cp 76cf6e49555b:/home/test.js /tmp
拷贝是一个手动过程,未来我们使用-v 数据卷技术可以实现自动同步
练习
-
nginx服务
# 查看镜像 shaoalong@shaoalongdeMacBook-Pro ~ % docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest b64abfdee99c 29 hours ago 668MB nginx latest fc16ec0c2d91 47 hours ago 134MB alpine/git latest 4ee6a3b79e0c 4 weeks ago 27.1MB centos latest e6a0117ec169 3 months ago 272MB # 开启容器 -d 后开运行; --name nginx1 容器命名为nginx1;-p 3344:80 开放端口3344 容器内端口80 shaoalong@shaoalongdeMacBook-Pro ~ % docker run -d --name nginx1 -p 3344:80 nginx 065b40e8fde264cd5bd5dd52fbca4e026909807e54ef4f3e6a44ff32bc60c748 shaoalong@shaoalongdeMacBook-Pro ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 065b40e8fde2 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:3344->80/tcp nginx1 # 访问nginx服务器 shaoalong@shaoalongdeMacBook-Pro ~ % curl localhost:3344 # 进入容器 shaoalong@shaoalongdeMacBook-Pro ~ % docker exec -it 70f7bcd44517 /bin/bash root@70f7bcd44517:/# ls bin docker-entrypoint.d home mnt root srv usr boot docker-entrypoint.sh lib opt run sys var dev etc media proc sbin tmp root@70f7bcd44517:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@70f7bcd44517:/# cd /etc/nginx # 容器内查看文件 root@70f7bcd44517:/etc/nginx# ls conf.d mime.types nginx.conf uwsgi_params fastcgi_params modules scgi_params # 退出容器 root@70f7bcd44517:/etc/nginx# exit exit shaoalong@shaoalongdeMacBook-Pro ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 70f7bcd44517 nginx "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:3344->80/tcp nginx03 # 停止容器 shaoalong@shaoalongdeMacBook-Pro ~ % docker stop 70f7bcd44517 70f7bcd44517 # 访问nginx服务 不可访问 shaoalong@shaoalongdeMacBook-Pro ~ % curl localhost:3344 curl: (7) Failed to connect to localhost port 3344: Connection refused
-
tomcat服务
# 启动容器 shaoalong@shaoalongdeMacBook-Pro ~ % docker run -d --name tomcat01 -p 3355:8080 tomcat 54525133497cff53373671f00ca21eaf44abdb276d49a3b6f1c120b478389c80 # 进入容器 shaoalong@shaoalongdeMacBook-Pro ~ % docker exec -it tomcat01 /bin/bash root@54525133497c:/usr/local/tomcat# ls BUILDING.txt NOTICE RUNNING.txt lib temp work CONTRIBUTING.md README.md bin logs webapps LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist # 拷贝文件到webapps root@54525133497c:/usr/local/tomcat# cp -r webapps.dist/* webapps # 退出容器 root@54525133497c:/usr/local/tomcat# exit exit # 访问tomcat服务 shaoalong@shaoalongdeMacBook-Pro ~ % curl localhost:3355
docker commit 命令
docker commit 提交容器成为一个新的镜像
docker commir -m=“提交信息” -a=“作者” 容器id 目标镜像名[:tag]
# 1.启动一个tomcat
# 2.发现这个默认tomcat是没有webapps应用的
# 3.自己拷贝webapp.dist中的文件到webapps中
# 4.将我们操作过的容器通过commit提交为一个镜像,我们以后使用我们修改过的镜像即可
shaoalong@shaoalongdeMacBook-Pro ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54525133497c tomcat "catalina.sh run" 46 minutes ago Up 46 minutes 0.0.0.0:3355->8080/tcp tomcat01
shaoalong@shaoalongdeMacBook-Pro ~ % docker commit -a="shaoalong" -m="add webapps app" 54525133497c tomcat01
容器数据卷
数据卷的概念
为了很好的实现数据保存和数据共享,Docker提出了***Volume*这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作*数据卷***
数据卷的作用
-
通过数据卷可以在容器之间实现共享和重用
-
对数据卷的修改会立马生效(非常适合作为开发环境)
-
对数据卷的更新,不会影响镜像
-
卷会一直存在,即使容器被删除!
注意:数据卷是被设计来持久化数据的,他的生命周期独立于容器,Docker不会在容器删除时自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有被任何容器引用的数据卷,无主的数据卷可能会站数据很多空间,所以要及时删除。
对于容器,只要数据卷设置的宿主机上的路径一样,那他们的数据卷就共享
使用数据卷
-v 宿主机文件路径:容器文件路径
# 启动tomcat容器,并挂载数据卷
shaoalong@shaoalongdeMacBook-Pro ~ % docker run -it -v /tmp/test:/home tomcat01 /bin/bash
root@3ad7f3a8f62a:/usr/local/tomcat# cd /
root@3ad7f3a8f62a:/# ls
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var
root@3ad7f3a8f62a:/# cd home
root@3ad7f3a8f62a:/home# ls
# 在容器home目录新建文件test.js
root@3ad7f3a8f62a:/home# touch test.js
root@3ad7f3a8f62a:/home# ls
test.js
# 在宿主机上查看容器元数据
shaoalong@shaoalongdeMacBook-Pro ~ % docker inspect 3ad7f3a8f62a
shaoalong@shaoalongdeMacBook-Pro test % cd /
shaoalong@shaoalongdeMacBook-Pro / % ls
Applications Volumes etc sbin
Library bin home tmp
System cores opt usr
Users dev private var
shaoalong@shaoalongdeMacBook-Pro / % cd tmp/test
# 可以看到宿主机的tmp目录也有test.js文件
shaoalong@shaoalongdeMacBook-Pro test % ls
test.js
# 在宿主机test目录新建文件host.js
shaoalong@shaoalongdeMacBook-Pro test % touch host.js
测试:
1. docker inspect 查看数据卷挂在地址
2.数据卷文件同步
3.即使关闭容器,只要不删除容器,文件依然可同步!
具名与匿名挂载
# 匿名拒载
-v 容器内路径!
docker run -d -P -v /etc/nginx nginx
# 查看所有 volume 的情况
shaoalong@shaoalongdeMacBook-Pro test % docker volume ls
DRIVER VOLUME NAME
local 5c4ff5ec8ac0b3c5f77918a9df170fa2f4fa9f03864d90fabf6f5af09da0f4c5
local 470d7d718eefad17204da047e9c0021562ecc5eaa629b80acaf85d7470e9da36
local 0963aa00d77eba3362e349c43327d96e6348af4e75ef8bc0b724630e090656f0
local c87f2468cab4eed723a38853ed2e323e416761370f3ec3f5f522d13ef8faca6a
local nginx_volume
# 具名挂载
-v 卷名:容器内路径
docker run -d -P -v nginx_volume:/etc/nginx nginx
# 查看卷
shaoalong@shaoalongdeMacBook-Pro test % docker volume inspect nginx_volume
[
{
"CreatedAt": "2021-12-24T13:04:01Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
"Name": "nginx_volume",
"Options": null,
"Scope": "local"
}
]
# 给数据卷以容器操作权限。(主机对数据卷有读写权限)
rw 读写权限(默认)
ro 只读权限
docker run -d -P -v nginx_volume:/etc/nginx:ro nginx
所有docker数据卷在没有指定目录的情况下,都是在var/lib/docker/volumes/xxx/_data
对于ro的数据卷,容器只有读的权限
初识Dockerfile
Dockerfile就是用来构建 docker 镜像的构建文件
通过这个脚本可以生成镜像,镜像是一层一层的,内容本是一个个的命令,每个命令都是一层。
# 创建一个dockerfile文件,名字可以随机 建议Dockerfile
# 文件内容中 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"] # 自动匿名挂载数据卷
CMD echo "----end----"
CMD /bin/bash
# 查看常见的文件
shaoalong@shaoalongdeMacBook-Pro docker-test % ls
Dockerfile
# 通过dockerfile文件创建镜像
-f 文件路径(支持相对路径和绝对路径)
-t 镜像名称
shaoalong@shaoalongdeMacBook-Pro docker-test % docker build -f Dockerfile -t shaoalong/centos .
# 查看镜像 - 能看到有镜像shaoalong/centos
shaoalong@shaoalongdeMacBook-Pro docker-test % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shaoalong/centos latest 0f3f2a3f6044 3 months ago 272MB
justincormack/nsenter1 latest d598f2517351 12 months ago 118kB
# 运行容器
shaoalong@shaoalongdeMacBook-Pro docker-test % docker run -it shaoalong/centos /bin/bash
1.可以看到容器内有两个目录volume01/volume02;通过 docker inspect 可以查看到容器数据卷的信息
2.在容volume01目录中创建文件,可看到宿主机对应的卷中有同步到文件
注意:mac中访问数据卷路径访问不到,需要两个命令方可
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
尝试之后发现直接闪退并提示如下:
[screen is terminating]
故需解决这个闪退问题,解决方案如下:
docker run -it --privileged --pid=host justincormack/nsenter1
Unable to find image 'justincormack/nsenter1:latest' locally
latest: Pulling from justincormack/nsenter1
5bc638ae6f98: Pull complete
Digest: sha256:e876f694a4cb6ff9e6861197ea3680fe2e3c5ab773a1e37ca1f13171f7f5798e
Status: Downloaded newer image for justincormack/nsenter1:latest
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个父容器实现数据共享,挂载数据卷的容器称为数据卷容器。
—volumes-from 容器id
# 通过 --volumes-from 启动的容器与数据卷容器的数据卷共享
docker run -it --volumes-from 1cb3820daf3d shaoalong/tomcat /bin/bash
Dockerfile
Dockerfile介绍
Dockerfile 是用来构建镜像的文件!命令参数脚本!
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
Dockerfile构建
基础知识
-
每一个保留关键字(指令)都必须是大写字母
-
执行从上到下顺序执行
-
‘#’ 表示注释
-
每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPORE # 保留端口配置
CMD # 指定这个容器启动时要执行的命令,只有最后一个命令会生效,可被替代
ENTRYPOINT # 指定这个容器启动时要执行的命令,可被追加
ONBUILD # 当构建一个被继承Dockerfile 这个时候就会运行ONBUILD指令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时设置环境变量
实战测试
创建自己的centos(包含vim及ifconfig指令)
# 1. 编写 Dockerfile 文件
shaoalong@shaoalongdeMacBook-Pro mycentos % cat Dockerfile
FROM centos
MAINTAINER shaoalong<1593439044@qq.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.构建镜像 docker build
# -f Dockerfile文件路径(绝对或相对路径)
# -t 镜像名[:tag]
# . 命令最后要有一个.
shaoalong@shaoalongdeMacBook-Pro mycentos % docker build -f Dockerfile -t mycentos .
[+] Building 45.5s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 249B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> CACHED [1/4] FROM docker.io/library/centos 0.0s
=> [2/4] WORKDIR /usr/local 0.0s
=> [3/4] RUN yum -y install vim 42.6s
=> [4/4] RUN yum -y install net-tools 2.6s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:1a7075b3a03b9fbe5bb9fb66f06e5ed23cd93c5a4c6b0 0.0s
=> => naming to docker.io/library/mycentos 0.0s
# 3.测试运行-比较运行centos与运行mycentos容器后的区别
shaoalong@shaoalongdeMacBook-Pro ~ % docker run -it mycentos
shaoalong@shaoalongdeMacBook-Pro ~ % docker run -it centos
mycentos与centos运行比较:
拓展 docker history 镜像id
CMD 与 ENTRYPOINT 的区别
- CMD和ENTRYPOINT指令都可以用来定义运行容器时所使用的默认命令
- Dockerfile至少指定一个CMD或ENTRYPOINT
- CMD可以用作ENTRYPOINT默认参数,或者用作容器的默认命令
- docker run指定时,将会覆盖CMD
- 如果是可执行文件,希望运行时传参,应该使用ENTRYPOINT
测试CMD
# 编写Dockerfile文件
shaoalong@shaoalongdeMacBook-Pro mycentos % vim Dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]
# 构建镜像
shaoalong@shaoalongdeMacBook-Pro mycentos % docker build -f Dockerfile-cmd-test -t cmdtest .
# 运行容器,我们发现 ls -a 命令生效
shaoalong@shaoalongdeMacBook-Pro mycentos % docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 想追加 -l 报错 ls -al
shaoalong@shaoalongdeMacBook-Pro mycentos % docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# 结论:CMD定义的指令,在 run 镜像加入指令时,会替换CMD的指令,即指令变成了 -l 而非 ls -a -l,致报错!
测试ENTRYPOINT
# 编写Dockerfile文件
shaoalong@shaoalongdeMacBook-Pro mycentos % vim Dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
# 构建镜像
shaoalong@shaoalongdeMacBook-Pro mycentos % docker build -f Dockerfile-entrypoint-test -t entrypointtest .
# 运行容器,我们发现 ls -a 命令生效
shaoalong@shaoalongdeMacBook-Pro mycentos % docker run entrypointtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 追加 -l
shaoalong@shaoalongdeMacBook-Pro mycentos % docker run entrypointtest -l
total 56
drwxr-xr-x 1 root root 4096 Dec 28 03:25 .
drwxr-xr-x 1 root root 4096 Dec 28 03:25 ..
-rwxr-xr-x 1 root root 0 Dec 28 03:25 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 28 03:25 dev
drwxr-xr-x 1 root root 4096 Dec 28 03:25 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 Sep 15 14:25 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 184 root root 0 Dec 28 03:25 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:26 root
drwxr-xr-x 11 root root 4096 Sep 15 14:26 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 Dec 28 03:25 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:26 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:25 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:25 var
# 结论:CMD定义的指令,在 run 镜像加入指令时,会追加ENTRYPOINT的指令,即指令变成了ls -a -l
部署tomcat
FROM centos
MAINTAINER shaoalong<1593439044@qq.com>
COPY readme.txt /usr/localreadme.txt
ADD apache-tomcat-9.0.33.tar.gz /usr/local
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_211
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATANINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.33/bin/logs/catalina.out
部署nginx
运用nginx镜像,运行一个web应用,项目挂载到宿主机上,在宿主机中修改文件。
# 1.启动两个服务,分别在端口8081与8082
const express = require('express')
const http = require('http')
const logger = require('morgan')
const app = express()
app.use(logger('dev'))
app.get('/users', (req, res) => {
res.send('8081端口相应')
})
http.createServer(app).listen(8081)
# 2.创建nginx.conf及app目录文件, 用于挂载到容器内
# nginx.conf文件:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 负载均衡;两个端口服务
# 注意:本地调试这里只能是ip不能是127.0.0.1及localhost
upstream alone {
server 192.168.44.221:8081 weight=1;
server 192.168.44.221:8082 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~^/users/ {
proxy_pass http://alone;
}
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 3.运行nginx,并与宿主机挂载
docker run -d -p 80:80 --name webnginx -v /Users/shaoalong/program/learn/docker/nginx-app/nginx/app:/usr/share/nginx/html -v /Users/shaoalong/program/learn/docker/nginx-app/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
# 4.进入容器
docker exec -it webnginx /bin/bash
# 进入容器后可执行以下命令
nginx -s reload # 重载nginx.conf文件
nginx -s reopen # 重启nginx
nginx -s stop # 强制停止Nginx服务
nginx -s quit # 优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -p prefix # 设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename # 设置配置文件(默认是:/etc/nginx/nginx.conf)
killall nginx # 杀死所有nginx进程