1 常用指令

1.1 镜像相关

1.1.1 加载镜像

docker load -i 镜像.tar.gz

1.1.2 删除镜像

docker rmi 镜像ID

1.1.3 查看容器镜像信息

docker inspect 容器ID

1.2 容器相关

1.2.1 退出容器

exit 退出容器且停止容器 ctrl+p+q 退出容器不停止容器

1.2.2 删除容器

docker rm 容器ID // 不能删除正在运行的容器 docker rm -f $(docker ps -aq) //递归删除所有容器,强制删除正在运行的容器

1.2.3 查看容器日志

docker logs -tf --tail 10 容器ID

1.2.4 进入容器

docker exec -it 容器ID //进入容器后,开启新的终端**(常用)** docker attach 容器ID //进入容器正在执行的终端,不会启用新的终端(不常用)

1.2.5 从容器内copy到宿主机

docker cp 容器ID:容器内路径 宿主机目的地路径

1.2.6 部署Nginx且进入容器

# --name 容器名称

# -p 本地端口:容器内端口

docker run -d --name nginx01 -p 3304:80 nginx:latest

# 进入容器

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

01633eca1246 nginx:latest "/docker-entrypoint.…" 22 minutes Up 22 minutes 0.0.0.0:3304->80/tcp nginx01

docker exec -it nginx01 /bin/bash

2 镜像原理

2.1 联合文件系统

2.2 容器数据卷

2.2.1 挂载

-v 设置容器卷映射, -v /宿主机路径:容器路径

容器修改的会映射到宿主机路径;就算容器停止,宿主机路径下的改动,也会映射到容器内路径;

# 运行mysql,并设置容器卷路径映射,

# -e 设置容器环境变量 MYSQL_ROOT_PASSWORD=mysql root账号密码

# -v 设置容器卷映射, -v /宿主机路径:容器路径

docker run --name mysql01 -d -e MYSQL_ROOT_PASSWORD=admin \

-v /home/bes/mysql:/var/lib/mysql mysql:5.7

除了真实容器卷路径映射外,还存在匿名挂载和具名挂载。

匿名挂载 -v 容器内路径 #只写了容器内的路径,没有写宿主机路径

docker run --name mysql02 -d -e MYSQL_ROOT_PASSWORD=admin -v /var/lib/mysql mysql:5.7

可通过docker inspect命令查看容器的具体信息,查询容器卷挂载信息。上述容器名称=mysql02 的容器卷挂载在/var/lib/docker/volumes/07c5e04aae4b85fcf34c*/_data路径下。 通过docker volume ls命令查看所有容器卷 挂载信息 [root@centos7 mysql]# docker volume ls

DRIVER VOLUME NAME

local 07c5e04aae4b85fcf34e84723c014ab3f97733c754cf044d1b7e60c4fa6033cd #匿名挂载

local 33cfe247169cc41ecaf1239e632c9d05b62a6922c1f01a42dafd861a64aabbde

local mysqlData #具名挂载

具名挂载 -v 宿主机文件夹名称(类似相对路径):容器内路径 #只写了宿主机文件夹:容器内路径,没有写宿主机绝对路径

# 注意,mysqlData为宿主机文件夹名称

docker run --name mysql02 -d -e MYSQL_ROOT_PASSWORD=admin \

-v mysqlData:/var/lib/mysql mysql:5.7

可执行docker volume ls 查看所有挂载卷目录,即查看所有映射的宿主机路径。

[root@centos7 mysql]# docker volume ls

DRIVER VOLUME NAME

local 07c5e04aae4b85fcf34e84723c014ab3f97733c754cf044d1b7e60c4fa6033cd #匿名挂载

local 33cfe247169cc41ecaf1239e632c9d05b62a6922c1f01a42dafd861a64aabbde

local mysqlData #具名挂载

匿名挂载都是随机生成文件夹名称。其默认位置:宿主机:/var/lib/docker/volume,数据存于mysqlData/_data文件夹中 具名挂载:是采用指定的文件夹名称。类似于相对路径,默认路径:宿主机:/var/lib/docker/volume,数据存于mysqlData/_data文件夹中 注意:所有docker未指定宿主机路径的容器卷映射,默认的位置都是在宿主机:/var/lib/docker/volume/xxx/_data路径下。大多数是使用具名挂载,推荐使用具名挂载

拓展:

-v 宿主机路径:容器内路径:ro #相对容器来说,容器内路径下文件只读;rw同理

ro=readonly,表示【容器内】该路径下文件【只读】,只能通过宿主机路径下进行修改

-v 宿主机路径:容器内路径:rw

rw=readwrite,表示【容器内】该路径下【可读可写】,容器内路径下文件和宿主机路径下都可修改

docker run --name mysql02 -d -e MYSQL_ROOT_PASSWORD=admin \

-v mysqlData:/var/lib/mysql:ro mysql:5.7

docker run --name mysql02 -d -e MYSQL_ROOT_PASSWORD=admin \

-v mysqlData:/var/lib/mysql:rw mysql:5.7

还可以再创建DockerFile 文件中通过VOLUME ["volume01", "volume02"] 命令来实现匿名挂载容器卷。同理,默认在**宿主机:/var/lib/docker/volume/xxx/_data**路径下

2.2.2 容器数据卷共享

多个容器之间数据共享,通过 --volumes-from命令。

原理:一个容器01通过-v 将容器内路径挂载到宿主机,而容器02、容器03通过--volumes-from 容器01实现02,03容器和01容器数据共享,即类似01作为02,03的父容器,02,03作为01的子容器,可继承01的内容。

注意:--volumes-from命令实现容器的数据共享,是通过cp复制命令实现。生命周期为:所有的共享容器都被删除

# 创建容器卷父容器

docker run --name centos01 -v testhome:/home -it centos #容器卷 父容器

# 创建容器卷 子容器02 03

docker run -it --name centos02 【--volumes-from】 centos01 centos

docker run -it --name centos03 【--volumes-from】 centos01 centos

上述创建的三个容器仅在 /home 目录下数据共享。通过CP命令实现。 通过三个容器分别在/home目录下创建ctos01、ctos02、ctos03,在三个容器都能看到。 若在/root目录下创建文件,则在其他容器内不可见。所以,仅在父容器卷目录下数据共享。

实战:实现MySQL两个容器内数据共享。 即:两个容器内的MySQL数据共享,使用同一份数据。

docker run -d -p 3316:3306 -v /var/lib/mysql -v /etc/mysql/conf.d -e \

MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7 #父容器

#通过--volumes-from命令实现和mysql01容器 /var/lib/mysql /etc/mysql/conf.d两个路径下数据共享

docker run -d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=admin --name mysql02 \

【--volumes-from】 mysql01 mysql:5.7

2.3 DockerFile

2.3.1 DockerFile指令

## 构建时命令

FROM # 基础镜镜像,一切从这里开始构建

FROM centos(镜像名称)

MAINTAINER # 镜像是谁写的,姓名+邮箱

MAINTAINER wl

RUN # 镜像构建的时候需要运行的命令

RUN yum install -y net-tools

ADD # 镜像构建的时候添加内容,添加文件。若是压缩包,会自动解压

COPY # 类似ADD ,镜像构建的时候将我们文件拷贝到镜像中

COPY ./test /usr/local

ENV # 镜像构建的时候设置环境变量!

ENV mypath /usr/local //类似键值对

WORKDIR # 镜像的工作目录

WORKDIR $mypath

VOLUME # 挂载的目录

VOLUME ["volume01", "volume02"]

EXPOSE # 暴露端口配置

EXPOSE 80

ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。 (了解即可)

## 容器启动时命令

CMD # 指定这个【容器启动的时候】要运行的命令,只有最后一个会生效,可被誉代

CMD /bin/bash

CMD ["ls", "-l"]

ENTRYPOINT # 指定这个【容器启动的时候】要运行的命令可以追加命令

ENTRYPOINT ["ls", "-l"]

/**

*CMD:该命令在执行docker run 容器 command时,

若指定了command,会【替换】dockerfile中的【CMD指令】

*

ENTRYPOINT: 该命令在执行docker run 容器 command时,

若指定了command,会【追加】在dockerfile中的【ENTRYPOINT指令后面】

*

*/

注意:

dockerfile中可以有多条cmd命令,但只是最后一条有效。CMD命令即避免执行docker run 容器 [command]时,最后输入的[command]指令。CMD命令的参数格式,一般写成 字符串数组的方式,如上面的例子。如: CMD ["echo","hello world"],虽然也可写成CMD echo hello word 方式,但这样docker会在指定的命令前加 /bin/sh -c 执行,有时有可能会出问题。 所以推荐采用数据结构的方式来存放命令。

2.3.2 创建dockerfile文件构建镜像

(1)构建简易版centos测试

# cat dockerfile-centostest

FROM centos

MAINTAINER wl

#RUN yum install -y net-tools

ENV mypath /usr/local

COPY ./test /usr/local

WORKDIR $mypath

VOLUME ["volume01", "volume02"]

EXPOSE 80

CMD /bin/bash

执行构建命令docker build -f dockerfile文件路径 -t 镜像名称[:flag 版本] .,注意,最后有个. docker build -f dockerfile-centostest -t centoscmd:0.1 .

[root@centos7 dockerfiletest] docker build -f dockerfile-centostest -t centoscmd:0.1 .

[+] Building 0.2s (8/8) FINISHED docker:default

=> [internal] load build definition from dockerfile-centostest 0.0s

=> => transferring dockerfile: 300B 0.0s

=> [internal] load metadata for docker.io/library/centos:latest 0.0s

=> [internal] load .dockerignore 0.0s

=> => transferring context: 2B 0.0s

=> [internal] load build context 0.0s

=> => transferring context: 83B 0.0s

=> CACHED [1/3] FROM docker.io/library/centos:latest 0.0s

=> [2/3] COPY ./test /usr/local 0.0s

=> [3/3] WORKDIR /usr/local 0.1s

=> exporting to image 0.0s

=> => exporting layers 0.0s

=> => writing image sha256:f9fb0108752379b21684143aa6737d578b45c2fe0dd5d3a170cd1b44780de4 0.0s

=> => naming to docker.io/library/centoscmd:0.1 0.0s

执行docker images 查看构建好的镜像 进入容器docker run -it centoscmd:0.1,可看出工作目录设置/usr/local成功,且test文件复制成功 (2)构建centos+tomcat镜像

编辑dockerfile文件 [root@centos7 dockerfiletest]# cat dockerfile-tomcattest

FROM centos

MAINTAINER wl

ADD apache-tomcat-9.0.85.tar.gz /usr/local/

ADD jdk-8u391-linux-x64.tar.gz /usr/local/

ENV WORKPATH /usr/local

WORKDIR $WORKPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_391

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.85

ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.85

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080

CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATALINA_HOME/logs/catalina.out

将apache-tomcat-9.0.85.tar.gz和jdk-8u391-linux-x64.tar.gz 压缩包cp到dockerfile同级目录。若不是同级目录,会导致出错,详情请看 执行构建命令:docker build -f dockerfile-tomcattest -t tomcat-diy:0.1 . 查看生成镜像 启动tomcat-dirty镜像:docker run --name tomcat02 -p 9090:8080 -d -v tomcat-webapps:/usr/local/apache-tomcat-9.0.85/webapps -v tomcat-logs:/usr/local/apache-tomcat-9.0.85/logs tomcat-diy:0.1 查看容器卷是否挂载docker volume ls

2.4 容器网络相关

后续学习记录会继续补充~~

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: