Docker 容器后台运行,就必须有一个前台进程
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
参考链接:https://www.bilibili.com/video/av59639711/?pikaqiu
1、常用指令
docker run 在本地新建并进入容器(容器中可能时centos,nginx等等,各自进入命令不一样)
docker run -it (-i:以交互模式运行容器,通常与-t同时使用;)
(-t:为容器重新分配一个伪输入终端) 启动交互式容器
docker run -d 启动守护式容器(docker ps 时不会出现)
docker ps 查询docker中运行的进程
docker ps -l 最近运行过的
docker ps -a 翻旧账,所有的运行过的和还在运行的进程
docker ps -n 3 前面三次运行过的进程
exit 关闭容器
ctrl+P+Q 退出容器,但是不关闭容器
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止容器
docker kill 容器id 强制停止容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm 一次性删除多个容器
docker top 容器id 查看容器内运行的进程
docker inspect 容器id 查看容器内部细节,返回json格式的内容
docker attach 容器id 重新进入退出的容器
docker exec -it 容器id +要对该容器执行的具体命令 在宿主机直接对具体的容器执行命令
attach:直接进入启动命令的终端,不会启动新的进程
exec:在容器中打开新的终端,并且可以启动新的线程(功能强大)
docker cp container:src_path dest_path 从容器中拷贝文件到宿主机中
docker run -it -p 8888:8080 tomcat 前面为自己设定的docker下的端口号
docker run -it -P tomcat 随机分配端口
docker commit -a="作者名" -m="提交的描述信息" 容器id要创建的目标镜像名:[标签名]
docker history 镜像id 查看镜像的变更历史
2、Docker容器数据卷
作用 :容器持久化;数据共享
docker cp 实现容器到主机的拷贝
数据卷实现容器到主机,主机到容器的数据共享
2.1 用命令向容器内添加数据卷:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名(容器可读写)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名(容器只读)
例如:
docker run -it -v /myDataVolume:/dataVolumeContainer centos
宿主机:
[root@localhost ~]# cd /myDataVolume
[root@localhost myDataVolume]# touch host.txt 在该目录下新建一个名为host.txt的文件
[root@localhost myDataVolume]# cat host.txt
当容器对host.txt文件进行读写之后,这里会显示更改后的文件内容
容器:
[root@localhost ~]# docker attach 新建的容器id
[root@fdf4a66d5555 /]# cd /dataVoumeContainer
[root@fdf4a66d5555 dataVoumeContainer]# ll
这里会返回主机在前面新建的 host.txt文件
[root@fdf4a66d5555 dataVoumeContainer]# vi host.txt
对 host.txt 文件进行读写操作
同样,也可以在容器中新建一个文件夹,宿主机也可以直接对其进行读写
2.2 容器停止退出后,主机修改文件,容器重启进入后,内容依然同步
2.3 DockerFile方式添加数据卷
2.3.1 Dockerfile是什么
在java中,helloWorld.java -----> helloWorld.class
在Docker中,images ----> DockerFile
Dockerfile是docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2.3.2 DockerFile添加数据卷步骤
a. 根目录下新建mydocker文件并进入
[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd /mydocker/
[root@localhost mydocker]# pwd
/mydocker
b. 构建DockerFile
[root@localhost mydocker]# vim Dockerfile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-------sucess1"
CMD /bin/bash
#新建/dataVolumeContainer1和/dataVolumeContainer2,创建成功打印"finished,-------sucess1"
c. build生成镜像
docker build -f /mydocker/Dockerfile -t 随意命名/centos .
# 注意 最后有一个"."
#例如 docker build -f /mydocker/Dockerfile -t cia/centos .
d. run容器
docker run -it 上个步骤自定义的名/centos
#我这里就为:docker run -it cia/centos
通过DockerFile方式添加数据卷,主机对应的默认地址,可通过 docker inspect 容器id 查看主机地址。
Docker 挂载主机目录,Docker访问出现 cannot open directory : Permission denied,
解决方法:在挂载目录后加一个 --privileged=true 参数
2.4 容器间传递共享(--volumes-from)
2.4.1 启动过程
a. 先启动一个父容器dc01
docker run -it --name dc01 cia/centos
b. --volumes-from dc02/dc03继承自dc01
docker run -it --name dc02 --volumes-from dc01 cia/centos
docker run -it --name dc03 --volumes-from dc01 cia/centos
各个容器添加的内容都能共享。dc01中的内容dc02/dc03可以继承,反之在dc02/dc03中添加的内容也会与dc01共享。换言之,最后dc01/2/3下的内容一摸一样。
2.4.2删除父容器,子容器之间还可以继续实现数据共享
#删除父容器dc01
[root@localhost ~]# docker rm -f dc01
dc01
#进入子容器dc02,并新建一个dc02_update.txt
[root@localhost ~]# docker attach dc02
[root@587fda6cb1fb dataVolumeContainer2]# touch dc02_update.txt
#进入子容器dc03,查看是否存在dc02_update.txt
[root@localhost ~]# docker attach dc03
[root@1be179c376e5 dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 27 07:00 dc02_update.txt
总结:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
3.DockerFile解析
3.1 DockerFile使用步骤:
1 手动编写一个符合file规范的dockerfile文件;
2 执行docker build 命令,获得一个自定义的镜像;
3 run
3.2 DockerFile构建过程解析
3.2.1 DockerFile内容基础知识
每条保留指令必须为大写字母,且指令后面至少要跟随一个参数;
指令按照从上到下顺序执行;
每条指令会创建一个新的镜像层,并对镜像进行提交。
3.2.2 Docker执行DockerFile的大致流程
docker从基础镜像运行一个容器;(基础镜像为DockerFile中FROM后的参数)
执行一条指令并对容器作修改;
执行类似docker commit的操作指令提交一个新的镜像层;
docker基于新的镜像运行一个新的容器;
继续执行下一条指令直到所有指令执行完成。
3.3 保留字指令
FROM 基础镜像
MAINTAINER 作者+作者邮箱
RUN 容器构建时需要执行的命令
EXPOSE 当前容器对外暴露的端口号
WORKDIR 指定容器创建后,终端默认登录的工作目录,未指定时是根目录
ENV 构建镜像过程中设置环境变量
COPY 拷贝
ADD 拷贝+解压缩
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令(DockerFile中可以有多个CMD,但只有最后一个生效)
ENTRYPOINT 指定一个容器启动时要运行的命令
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发