Skip to main content

docker常用命令

前言#

最近做了一小套前后端系统,vue+koa+mysql,做了相关的监控页面。实验室都在搞docker,想起以前做项目的时候用过,现在再捡起来熟悉一下。把前后端项目都用docker部署了一下,写了dockerfile进行构建。

一、为什么要用docker#

  1. 解决一个问题:「为什么会出问题呢?在我的电脑上运行没问题啊!」

  2. 环境的快速部署,提高运维人员效率。

二、一些概念#

镜像(image):从Docker Hub拉取下来镜像,每次运行镜像,docker会生成一个容器承载镜像。如nginx镜像,nodejs镜像。

容器(container):容器与容器之间是隔离的,可以通过shell进入容器内部,类似一个小型的linux。

镜像与容器的关系就像是:类和对象的关系。

虚拟机和docker容器的区别:

  • 对于虚拟机而言,server之上运行操作系统,在操作系统内再运行一个application,这个application包含了新的操作系统、libs、apps。

  • 对于docker容器而言,server之上运行操作系统,在操作系统上运行容器,容器内没有额外的操作系统,只包含一些libs、apps,而且容器之间是互相隔离的。

avatar avatar

三、常用的命令#

docker ps               # 查看进程docker ps -a        # 查看所有进程docker ps -aq       # 查看所有容器的id
docker run -itd (image_name)    # 生成一个容器来运行镜像
docker stop (container id)      # 关闭一个容器docker start (container id)     # 打开容器docker restart (container id)   # 重启容器docker rm (container id)            # 删除容器
docker images       # 查看所有镜像docker rmi (image id)                   # 删除镜像
docker cp (container id):/home/filename ~/  # 将文件从容器内移动到容器外部

四、容器数据卷#

如果数据都在容器内部,当容器使用完删除掉,数据就会丢失。

需要将Mysql之类的数据可以存储到本地!

容器之间需要有一个数据共享的技术,docker容器中产生的数据,可以同步到本地。=》卷技术。

将容器内的目录,挂载到linux宿主机上。

最终需求:容器的持久化和同步操作!容器间也是可以数据共享的

匿名挂载: -v 容器内路径

具名挂载: -v 卷名:容器内路径

指定路径挂载: -v /宿主机路径:容器内路径

如果指定了路径,就按照指定的路径挂载。没有指定路径,看是具名还是匿名的挂载。可以通过docker volume ls查看,位置都是在/var/lib/docker/volumes内。

docker容器内的卷,具名挂载,没有指定目录的情况下都是在/var/lib/docker/volumes内。

# 一旦设置了容器的权限,容器对我们挂载出来的内容就有限制了。docker run -d -P --name nginx001 -v volum-nginx:/etc/nginx:rw nginx # 可读可写docker run -d -P --name nginx001 -v volum-nginx:/etc/nginx:ro nginx # 只读
# ro代表只能由宿主机改变,容器内部无法操作。

除了容器和宿主机之间可以数据共享,容器之间也可以数据共享

# -it 表示交互# --name表示命名# -v表示挂载目录,宿主机目录:容器内目录
docker run -it --name docker01 -v /home/ceshi:/home/ceshi   centos /bin/bash    # 以centos为镜像,命名docker01容器cd /home/ceshi  touch docker01  # 执行完上面的命令会进入docker01容器,在ceshi目录下新建docker01文件
exit # 退出容器
docker run -it --name docker02 --volumes-from docker01 centos /bin/bash     # 以centos为镜像,挂载卷容器cd /home/ceshi  touch docker02  # 进入容器名为docker02的容器,里面已经存在docker01文件,同时新建docker01文件exit # 退出容器
cd /home/ceshi # 进入宿主机的/home/ceshi目录,发现docker01和docker02文件

五、Dockerfile#

DOckerfile就是用来构建docker镜像的构建脚本!

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run运行镜像
  4. docker push 发布镜像(DockerHub、阿里云仓库镜像)

DockerFile的指令#


FROM        # 基础镜像,一切从这个镜像开始MAINTAINER  # 镜像的维护者是谁,姓名+邮箱RUN         # 镜像构建的时候需要运行的命令WORKDIR         # 镜像的工作目录VOLUME          # 挂载的目录EXPOSE          # 保留端口的配置CMD                 # 指定这个容器启动的时候,要执行的命令,只有最后一个会生效,可以被替代ENTRYPOINT  # 指定这个容器启动的时候,要执行的命令,可以追加命令ONBUILD         # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令COPY                # 类似ADD, 将我们的文件拷贝到镜像ENV                 # 构建的时候设置环境变量

可以通过history命令查看镜像的构建过程。

docker history imageid

CMD命令和ENTRYPOINT命令的区别?

在dockerfile内,CMD和ENTYRPOINT命令都是期望在容器运行后执行的指令。

使用CMD构建的镜像,运行镜像时添加的参数会把指令覆盖。

使用ENTRYPOINT构建的镜像,运行镜像时添加的参数会累加到dockerfile内的命令后面。

case:

# CMD指令的dockerfileFROM centosCMD ["ls -a"]
docker build -f dockerfile -t testcmd . # 构建镜像
docker run testcmd -l       # 报错docker run testcmd ls -al   # 显示目录所有详细条目
# ENTRYPOINT的dockerfileFROM centosENTRYPOINT ["ls","-a"]
docker build -f dockerfile -t testentrypoint .  # 构建镜像docker run testentrypoint -l    # 显示目录所有详细条目

编写dockerfile#

编写dockerfile文件,官方命名Dockerfile,build会自动找这个文件进行构建。就不需要-f指定了。

六、docker网络#

在宿主机使用docker每生成一个容器,都会生成一对网卡。在宿主机使用ping命令可以ping通容器内的网络。

veth-pair是一对虚拟设备接口,都是成对出现的,一段连着协议,一段彼此相连。

veth-pair充当一个桥梁,连接各种虚拟网络设备。

当容器删除掉,对应的一对网桥就没了。


written by Rain 2020.10.05