Docker 的诞生
我们总是会遇到测试对开发说项目又不 work 了, 开发总说: 在我电脑上是 ok 的阿.
项目组加了新人, 我们就需要教新人配置各种开发环境, 每换一台机器就要配置一次, 每来一个新人就要配置一次.
于是我们想, 有什么办法可以在安装软件的时候把环境也安装过来? 一摸一样复制过来就没这么多问题了.
于是, 我们开始用虚拟机, 它自己一套系统, 然后你在里面配置好环境, 复制给队友就好了. 根本上虚拟机也是一个文件.
但是有个缺点就是太大了! 启动太慢! 一些系统的操作完全是多余的.
于是就开始用 linux 容器. Linux 容器不是模拟一个完整的操作系统, 而是对进程进行隔离. 容器里面的应用, 直接就是底层系统的一个进程, 操作系统使用宿主的操作系统.
Docker 就是 Linux 容器的一种封装.
Docker 做什么
web 应用的自动化打包测试
微服务
提供开发环境
安装 docker 应用
mac 安装地址 https://store.docker.com/editions/community/docker-ce-desktop-mac
通过 dmg 安装, 打开这个应用就可以了.
通过 docker -v 来测试有没有安装成功.
第一个 docker 应用
docker 的强大之处, 一句开启一个 nginx 服务.
docker run -d -p 80:80 --name webserver nginx
然后打开 http://localhost/ 看一下, 如果没有问题应该就可以看到 nginx 的欢迎页了.
docker image
docker 的核心概念之一, image,image 其实就是镜像. 一个容器是由 1 个或多个 image 组成的, 比如我们 nginx 的应用, 就是下载了 docker 提供的 nginx 镜像.
一个 web 应用可以有多个 image, 比如 nginx,python,db 等等, 我们可以自由组合 image 从而生成我们自己的 iamge! 发布我们自己的 image, 大家就可以直接下载我们的镜像, 从而直接在同一个环境下开发和获取服务啦.
我们可以看一下我们当地的镜像.
- docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest b175e7467d66 3 weeks ago 109MB
可以看到每个镜像的一些信息, 也可以通过
docker image rm nginx
来删除这个镜像.
docker container
docker 的核心概念之二, container,container 是 docker 的容器, 我们所有运行的程序都需要 container 来承载.
运行一个程序需要做什么? 首先需要从 docker hub 上面找到我们需要的 image 文件 (也可以根据自己的需求自己构造 image 文件), 然后通过 docker run 命令生成一个容器来供程序运行, 然后我们的程序就可以运行在 docker 上了.
我们第一个应用的
docker container run
命令会从 image 文件, 生成一个正在运行的容器实例, 我们就可以通过 ip 来访问这个服务.
我们第一个命令的各个参数含义如下:
-d container 做为守护进程在后台运行
-p 本机 80 端口映射 container80 短裤
--name 容器的名字叫做 webserver.
为什么我们只有 run 命令而没有拉取 nginx 的 image 文件呢?
docker 会首先找本地 nginx image, 如果没有就自动从 docker hub 上面下载.
当然也可以自己首先下载到本地:
docker image pull library/nginx
其中 library 是 image 文件所在的组, 由于 Docker 官方提供的 image 文件, 都放在 library 组里面, 所以它的是默认组, 可以省略.
image 文件生成的容器实例, 本身也是一个文件, 称为容器文件.
也就是说, 一旦容器生成, 就会同时存在两个文件: image 文件和容器文件.
而且关闭容器并不会删除容器文件, 只是容器停止运行而已.
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器, 包括终止运行的容器
$ docker container ls -a
我们可以看到我们正在运行的 nginx 服务.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b559b5addf8 nginx "nginx -g'daemon of..." 13 days ago Up 2 seconds 0.0.0.0:80->80/tcp webserver
当然我们也可以通过 start,stop,restart 来控制服务的情况.
比如
docker container stop webserver
我们通过 ps 命令来看一下现在的容器情况:
docker ps -a
会看到, 我们的 webserver 的 status:Exited (0) About a minute ago. 我们再运行
docker container start webserver
就可以重启服务.
可以简写为
docker start webserver
和
- docker stop webserver
- ,
- docker rm webserver
.rm 命令顾名思义就是删除这个 container 了.
容器通信
关于容器和 image 的基础操作其实就几个命令. 还有容器的通信也是很重要的, 因为我们需要知道容器的情况, debug 什么的, 就需要对容器进行操作.
这只讲一个命令就是 docker exec. 这个命令就允许你进入容器.
比如
docker exec -it webserver bash
.
-it 参数: 容器的 Shell 映射到当前的 Shell, 然后你在本机窗口输入的命令, 就会传入容器.
bash: 容器启动以后, 内部第一个执行的命令. 这里是启动 Bash, 保证用户可以使用 Shell.
这样我们就进入到了 webserver 的容器内部, 我们可以通过修改 nginx.conf 来操作 nginx 服务, 或者查看 nginx 的 log.
docker log
docker 的 log 有个命令
docker logs webserver
, 我们可以看到 docker 的这个服务的访问情况.
有时候会遇到 docker start xxx 然后看一下 docker ps -a, 这个 xxx 还是没有启动. 这时候可以看一下 docker logs xxx, 他很可能报错了. 然后你的容器就启动不了了.
生成自己的 image 文件
之前提到, 你进行了一些操作, 容器启动不了, 然后你进入这个 bash, 他会告诉你需要先启动容器才能进入 bash. 那怎么办呢, 此时就需要一些比较麻烦的办法了, 比如接下来要说的生成自己的 image 文件.
docker run -d -p 80:80 --name webserver nginx
, 后面指定了 nginx 做为 image, 它启动就会首先执行 nginx xxx 来开启这个 nginx 服务. 但是因为一些原因开启不了. 那我们只能以 bash 的方式'开启'这个容器. 然后修改这个 container 的内容. 再以 nginx 的方式重启.
我们怎么以 bash 的方式启动我们这个 nginx container 呢? 我们需要把当前的 container 生成为一个我们自己的 image 文件.
我们通过 run 命令把 image 文件生成一个 container 文件, 我们也可以通过 docker commit 来生成我们的 image 文件:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a : 提交的镜像作者;
-c : 使用 Dockerfile 指令来创建镜像;
-m : 提交时的说明文字;
-p : 在 commit 时, 将容器暂停.
docker commit -a 0b559b5addf8 temp
, 我们生成一个临时的 temp image. 可以通过 docker image ls 查看我们生成的 image.
docker rm webserver
我们删掉没用的 container.
docker run -it --name webserver -p 80:80 -d temp
. 我们根据我们生成的 temp 来生成一个 container 容器.
ok, 现在我们可以
docker exec -it webserver bash
来修改我们的配置了.
修改完之后还需要再次生成一个 iamge, 因为我们需要通过 nginx 的方式启动这个 iamge.
docker commit -a 0c5a9b5asddf8 temp2
. 我们再次根据改完之后的 container 生成了一个 temp2.
docker rm webserver
我们删掉没用的 container.
docker run -it --volumes-from temp2 --name webserver -p 80:80 -d nginx
.
这样就完成了.--volumes-from 参数是可以允许我们从另一个容器当中挂载容器中已经创建好的数据卷.
0b559b5addf8 是我们 webserver container 的 id
具体的命令可以看 https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/--volumes-from.html
来源: https://www.cnblogs.com/dh-dh/p/9001650.html