docker常用命令
#
前言最近做了一小套前后端系统,vue+koa+mysql,做了相关的监控页面。实验室都在搞docker,想起以前做项目的时候用过,现在再捡起来熟悉一下。把前后端项目都用docker部署了一下,写了dockerfile进行构建。
#
一、为什么要用docker解决一个问题:「为什么会出问题呢?在我的电脑上运行没问题啊!」
环境的快速部署,提高运维人员效率。
#
二、一些概念镜像(image):从Docker Hub拉取下来镜像,每次运行镜像,docker会生成一个容器承载镜像。如nginx镜像,nodejs镜像。
容器(container):容器与容器之间是隔离的,可以通过shell进入容器内部,类似一个小型的linux。
镜像与容器的关系就像是:类和对象的关系。
虚拟机和docker容器的区别:
对于虚拟机而言,server之上运行操作系统,在操作系统内再运行一个application,这个application包含了新的操作系统、libs、apps。
对于docker容器而言,server之上运行操作系统,在操作系统上运行容器,容器内没有额外的操作系统,只包含一些libs、apps,而且容器之间是互相隔离的。
#
三、常用的命令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文件
#
五、DockerfileDOckerfile就是用来构建docker镜像的构建脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run运行镜像
- 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