Docker学习笔记

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被触发

posted @ 2019-08-29 16:49  罗火火  阅读(168)  评论(0编辑  收藏  举报