docker学习

常用命令

镜像命令

  • 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 查看数据卷挂在地址

测试效果1 - docker inspect 查看数据卷挂在地址

2.数据卷文件同步

测试效果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 是用来构建镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. 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进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s-alone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值