docker 即容器mysql
Docker 远程镜像仓库git
DockerHubweb
DaoCloud / Aliyunredis
Docker Images
是用来建立 docker 容器的只读模版,其中包含了容器启动所须要的全部配置信息和运行程序,一次构建以后能够屡次复用。sql
从结构上来说,Docker Image
是分层次的,如图所示:docker
这样就天然出现了父镜像和基础镜像的概念,在图中,每个上层镜像都是依赖于下一层的镜像,因此下层镜像可称为上层镜像的父镜像,而最底层的镜像是没有父镜像的,可称其为基础镜像(Base Image)。shell
实际场景下,通常咱们本身建立的镜像都会依赖于某个 Linux
操做系统的镜像,例如 ubuntu
,大多数状况下,咱们可称其为基础镜像,可是咱们也能够查看 ubuntu
镜像的 Dockerfile
会发现,它也是依赖于一个叫 scratch
的镜像,scratch
是 docker
的一个空镜像,里面只有 docker
加入的一些元数据,若是咱们想要追求本身的镜像尽量的轻量,也能够将 scratch
镜像做为咱们的基础镜像来构建。ubuntu
Dockerfile
是用来讲明如何自动构建 docker image
的指令集文件,在 Dockerfile
中编写好指令集以后,咱们就能够经过 docker build
命令构建镜像,Dockerfile
文件中命令的顺序就是构建过程当中执行的顺序。vim
如下为几个经常使用的指令:数组
全部 Dockerfile
都必须以 FROM
命令开始,表示其依赖的镜像。
FROM image_name
MAINTAINER author <author_email>
RUN <command>
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
CMD ["executable","param1","param2"]
EXPOSE <port>
RUN
、CMD
与 ENTRYPOINT
命令的工做目录WORKDIR /path/to/workdir/in/container
VOLUME ["/data"]
关于 Dockerfile
编写有如下几点须要注意:
尽可能不要省略 MAINTAINER
信息。
EXPOSE
的端口不使用公有端口。
CMD
与 ENTRYPOINT
命令使用数组语法。
另外,在国内使用 docker
(以 ubuntu 为例), Dockerfile
第一个执行的命令最好为(具体缘由你猜):
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \ && apt-get update --fix-missing \ && apt-get -y upgrade
Docker Container
中包含了咱们的应用代码和代码执行的环境,是用来打包分发代码的单元。
首先要编写 Dockerfile
,在文件中写入构建镜像须要的指令集,而后执行下面命令:
docker build {image_name} {/path/to/Dockerfile}
例如,咱们构建一个 mysql
的镜像,先编写 Dockerfile
FROM ubuntu:14.04 MAINTAINER Tairy <tairyguo@gmail.com> # Install Base. RUN \ sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ apt-get update && \ apt-get -y upgrade && \ apt-get install -y build-essential && \ apt-get install -y software-properties-common && \ apt-get install -y byobu curl git htop man unzip vim wget RUN apt-get -y install mysql-server EXPOSE 3306 CMD ["mysqld"]
执行
docker build -t mysql ./
构建工具将先在本地查找 ubuntu:14.04
的镜像,若是有,则直接依赖使用,若是没有,将去远程的仓库中下载官方构建的 ubuntu:14.04
的镜像,固然由于一些不可描述的缘由,这个下载过程成功率不大,并且很是耗时,因此咱们能够作以下优化:
docker pull daocloud.io/library/ubuntu:wily-20160706
而后将 Dockerfile
中 FROM
命令修改成:
# 我注册了daocloud 帐号,就使用 daocloud 的镜像,也能够选择使用阿里云的镜像。 FROM daocloud.io/library/ubuntu:wily-20160706
这样,就节省了不少的时间。
总之,在安装环境的过程当中,由于某个伟大的防火墙工程,咱们须要的大部分资源都无法顺利的获取到,解决办法就是将下载的源换成国内某些厂商提供的镜像源。(推荐阿里云,毕竟有钱,稳定。)
通过一段时间的自动构建,即可生成一个可用的 mysql
镜像,使用 docker images
命令查看构建好的镜像列表,输出:
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest ffe5a4341fee 1 days ago 1.009 GB
删除一个镜像,使用下面命令:
# -f 表示强制删除,慎重使用 docker rmi -f image_name
有了基础的镜像模板以后,就能够建立容器来执行应用代码,具体用到 run
命令:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如咱们要建立一个运行 mysql 的容器,能够执行
docker run -d --name db1 -v `pwd`:/data:rw -p 8001:3306 mysql
这条命令将建立后台执行的 mysql 容器,里面运行一个 mysql 服务器,可使用 docker ps
命令查看启动的容器。
-d 参数表示后台守护进程运行容器。
--name 参数表示容器的名称,可随意取。
-v 表示主机和容器共享文件的映射,容器的目录就是 Dockerfile 中用 VOLUME 命令定义的目录。
-p 表器主机和容器端口映射,容器的端口就是 Dockerfile 中用 EXPOSE 命令绑定的端口。
关于建立容器的时候的坑:
通常来讲,咱们会在
Dockerfile
中的最后用 CMD 命令定义容器启动以后执行的命令,可是若是咱们定义的命令执行报错或者命令没有建立一个守护进程的话,docker ps
以后是看不到容器在运行的,此时可使用docker l ogs
命令查看容器启动的日志,进行排错。
固然,咱们也能够在 run 的时候定义容器启动的命令,例以下面命令将启动一个 ubuntu 的容器,并执行 /bin/bash
程序,进入 ubuntu 的 terminal:
docker run -it ubuntu:14.04 /bin/bash
此命令成功的标志就是你会发现命令行变成了相似:
root@d71ff8587917:/#
说明如今已经进入了 ubuntu
的容器中,能够直接在此命令行中操做 ubuntu
,或者输入 exit
回车以后便可退出,退出以后再 docker ps
会发现容器也再也不运行了。
一些经常使用命令:
docker ps -a
命令能够列出全部的容器,包括已经终止运行的。
docker rm container_name/container_id
能够删除某个容器。
docker start container_name/container_id
启动某个容器。
docker stop container_name/container_id
终止某个容器。
docker exec -it contaner_name /bin/bash
在容器中执行 /bin/bash
,执行该命令以后将能够以交互命令行的方式操做容器,另外 /bin/bash
能够替换成任意可执行命令。
docker-compose
是用来建立和管理多容器应用的工具,使用 docker-compose
只需三步:
编写应用运行环境的 Dockerfile
,即 image。
编写 docker-compose.yml
,在 services
块下指定容器相关参数以及与其它容器的依赖关系。
执行 docker-compose up
,运行应用。
一个简单的 docker-compose.yml
以下:
version: '2' # compose 版本,当前为 2 services: web: # web 容器 build: . # Dockerfile 所在路径 ports: - "5000:5000" # 端口映射 volumes: - .:/code # 文件路径映射 - logvolume01:/var/log links: - redis # 连接容器 redis: image: redis # 定义连接容器 volumes: logvolume01: {}