三分钟轻松搞定docker,建议收藏

110 阅读4分钟

“持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

做了好久的游戏,感觉和外面的技术有点脱节,游戏公司的技术基本上都是固定的,因为生产效率第一,所以更新换代比较慢。作为一个程序不能停止学习,因为停止学习就会被社会抛弃,今天聊一下docker ,这个现在比较火的交付容器技术。还不赶紧学起来。

1、docker 是啥

1.1 docker概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

换句人话说docker 就是在部署的时候屏蔽环境细节的一个环境。

1.2 docker 和虚拟机的区别

docker 是更轻量级的虚拟机,就是一个软件,更节省系统资源

Docker 容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像 Java 虚拟机一样,“一次编写,到处运行(Write once, run anywhere)”,而 Docker 是“一次构建,到处运行(Build once,run anywhere)

1.3 docker 的架构

client 就是我们发送命令的地方,也是我们常操作的地方

docker host 就是我们服务器上的容器,也是app 运行的地方

registry 就是存放app 的地方,可以搭建私有的仓库,官方的Docker hub是一个用于管理公共镜像的好地方。

image.png

2、dockerfile 制作

dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

Docker通过读取Dockerfile中的指令自动生成映像。

Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

image.png

# 基础镜像
FROM java:8
# 默认工作空间
VOLUME /tmp
WORKDIR /opt/his
# 复制为ecard
ADD target/server-adapter-0.0.1-SNAPSHOT.jar /opt/his/server-adapter.jar
ADD run.sh /opt/his/run.sh
​
RUN bash -c 'touch /server-adapter.jar'
# 时钟
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#暴露端口对外
EXPOSE 9083
EXPOSE 9081
#执行 脚本
ENTRYPOINT ["bash","/opt/his/run.sh"]

3、常用的docker命令

docker ps 列出容器

image.png

配合 grep 使用,查出自己的app的容器id :d4f5ae7107f3

docker inspect : 获取容器/镜像的元数据,可以查看自己配置的环境变量和挂载的目录

docker top :查看容器中运行的进程信息,支持 ps 命令参数。

docker logs -f 跟踪日志输出

docker exec :在运行的容器中执行命令 docker exec -it cid bash

docker cp :用于容器与主机之间的数据拷贝 docker cp src dest

docker rm :删除一个或多个容器。 -f 强制删除一个运行中的容器 docker

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

docker images 来列出本地主机上的镜像

-v 挂载的只能

有几点需要注意:

host机器的目录路径必须为全路径(准确的说需要以/或~/开始的路径),不然docker会将其当做volume而不是volume处理

如果host机器上的目录不存在,docker会自动创建该目录

如果container中的目录不存在,docker会自动创建该目录

如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉

volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes。

将my-volume挂载到container中的/mydata目录:

4、一个例子

下面是一个在公司使用的启动脚本,主要做了几件事情

注入环境变量

挂载目录

暴露端口

设置文件镜像