前段时间Docker部分的内容学习了镜像与容器的操作,属于比较基础的内容,如果大家对Docker基本命令还有疑问可以看一下我的这篇文章,我整理了Docker常用的基本命令↓
Docker学习笔记(一)——基本使用
这篇文章的内容是来学习Docker的高级用法。
当我们创建运行了一个容器,这个容器可能会产生一些日志或数据,例如Mysql数据库容器产生的数据。但是如果容器出现了问题,被误删了,容器内的数据也会随之丢失。我们利用容器数据卷的能力可以进行容器与主机之间、容器与容器之间的数据共享。将容器内数据保存到主机上进行持久化。这样就可以避免容器被删除后数据丢失的事故。
那么具体应该如何操作呢?
# -v命令为挂载,实现主机目录与容器内目录数据共享
# 主机目录不需要已经存在,执行此命令时会自动创建文件目录
# 即使容器停止运行,目录挂载依然存在,所以我们挂载以后可以不用进入容器修改配置文件
docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash
当我们运行了一个挂载的容器后,可以这样验证此容器已经挂载
# 此命令会在命令行以json的格式打印此容器的信息
# 其中Mounts对象中就为容器的挂载信息
# 我们可以通过此对象来确定容器是否已经挂载
docker inspect 容器id
具名挂载/匿名挂载
具名挂载:-v 挂载的时候自己指定主机文件目录与容器内文件目录关联就被称为具名挂载。
# 以nginx为例
# 指定路径挂载,以主机目录与容器内目录关联
docker run -d -P --name myNginx -v /home/nginx:/etc/nginx nginx
# 具名挂载,以主机docker文件夹下volumes目录下的myNginx01目录与容器内目录关联
docker run -d -P --name myNginx -v myNginx01:/etc/nginx nginx
匿名挂载:-v 挂载的时候不指定主机文件目录,只指定容器内文件目录与主机关联就被称为匿名挂载。
# 匿名挂载,-v后面只有容器内目录,默认与主机内docker文件目录下的volumes文件目录下的对应容器ID的文件夹关联
docker run -d -P --name myNginx -v /etc/nginx nginx
配置权限
我们挂载了以后,可以通过ro/rw来配置读写权限
# ro表示此文件夹下内容不可在容器内进行修改,只能通过主机目录修改文件
# rw(默认)表示在容器内目录与主机目录下都可以进行修改
docker run -d -P --name myNginx -v /home/nginx:/etc/nginx:ro nginx
容器间挂载
我们通过挂载可以实现主机文件目录与容器内目录进行挂载,在启动时我们也可以通过命令来实现容器间挂载。
容器间挂载类似于继承关系
# 添加 --volumes-from 要关联的容器名 就可以在启动的时候与其他容器进行挂载
docker run -it -name 自定义容器名 --volumes-from 要关联的容器名 镜像名
Dockerfile是一个脚本文件,我们通过docker中的build命令,可以创建自定义创建一个镜像。
Dockerfile的意义在于通过这个脚本我们可以创建一个符合我们开发环境的自定义的镜像。
脚本命令(严格区分大小写,命令全部为大写字母)
命令 | 注释 |
FROM | 指定基础镜像,最开始的镜像。如果安装生产环境,那么基础镜像就应该是操作系统。docker官方指定的基础镜像一般为scratch镜像 |
MAINTAINER | 镜像开发者信息,惯例为姓名<邮箱> |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 添加内容,可添加压缩包,会自动解压 |
COPY | 将文件拷贝到镜像中 |
WORKDIR | 设置镜像工作目录,设置后进入容器不再默认进入根目录,而是进入工作目录 |
VOLUME | 设置容器卷,匿名挂载 |
EXPOSE | 对外指定暴露端口 |
CMD | 指定容器启动后要运行的命令,例如下载内容、也可以["命令","参数"] 执行命令,在docker run命令启动时在命令后面追加参数时不会进行拼接,会直接报错 |
ENTRYPOINT | 指定容器启动后要运行的命令,例如下载内容、也可以["命令","参数"] 执行命令,在docker run命令启动时在命令后面追加参数时会进行拼接 |
ONBUILD | 构建一个被继承的Dockerfile的时候就会运行ONBUILD指令 |
ENV | 构建的时候设置环境变量 |
Dockerfile的简单使用过程
1.编写Dockerfile文件(建议文件名为Dockerfile,构建时可以忽略-f dockerfile文件名参数)
# 在什么镜像的基础上创建
FROM centos
# 指定容器内目录进行匿名挂载
VOLUMES ["volumes1", "volumes2"]
# 打印字符串
CMD echo "is OK"
# 默认进入容器内使用的命令行
CMD /bin/bash
2.进行构建
# 最后面的 . 说明在当前目录下创建
docker build -f Dockerfile文件名 -t 构建的镜像名:自定义版本 .
3.启动镜像
docker run -it 镜像名 /bin/bash
Dockerfile编写JAVA开发环境
# 选择基础镜像
FROM centos
# 设置创建人信息
MAINTAINER 姓名<邮箱>
# 添加JDK压缩包,会自动解压到容器内/usr/local/目录下
ADD jdk压缩包 /usr/local/
# 添加tomcat压缩包,会自动解压到容器内/usr/local/目录下
ADD tomcat压缩包 /usr/local/
# 安装vim编辑命令
RUN yum -y install vim
# 配置环境变量,键值对,下面可用$key的方式获取值
ENV MYPATH /usr/local
# 配置工作目录,进入容器首先进入工作目录
WORKDIR $MYPATH
# 配置jdk环境变量
ENV JAVA_HOME /usr/local/
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 配置tomcat环境变量
ENV CATALINA_HOME /usr/local/
ENV CATALINA_BASH /usr/local/
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露8080端口
EXPOSE 8080
启动容器时自动启动tomcat
CMD /usr/local//bin/startup.sh && tail -F /usr/local/tomcat解压后文件名/bin/logs/catalina.out
类似于GitHub的概念,可以进行镜像的提交,以供他人下载镜像。
DockerHub
1.主机连接登录DockerHub
# -u填写登录用户名
# -p填写登录用户密码
# 如果不希望登录密码可见,可以-u 用户名后回车,隐式输入密码
docker login
# 退出登录
docker logout
2.连接后提交镜像
# 登录后我们直接就可以使用push进行提交镜像
docker push 镜像名称:版本号
# 如果提交不上去可能是因为没有定义版本号,所以我们要进行如下操作
# 根据镜像ID复制一个镜像,并设置镜像名称与版本号
docker tag 源镜像ID 镜像名称:版本号
阿里云镜像仓库
1.登录阿里云账户
2.找到容器镜像服务
3.创建实例
4.设置仓库密码
5.创建命名空间
6.创建镜像仓库
下一步后我们可以选择代码源,可以与Git关联起来,当代码变更后,自动构建镜像,如果不需要与代码源关联,则选择本地仓库即可
创建后会出现操作手册,登录阿里云账号,下载镜像,提交镜像的操作都有教程
由于这部分内容还有疑惑,且暂时没有涉及,就暂时没弄,反正就是docker容器之间的网络通信,很想知道的话再看一下哈,等以后有机会的时候我在重新学习一遍,再发表过来