1.Docker安装:
https://www.docker.com/get-started
下载docker桌面windows版
安装成功后,CMD中使用命令: docker version,如果结果类似于下,并且没有任何报错信息则安装成功:
2.Docker和VM虚拟机的区别
可以认为是线程和进程的区别, docker更轻量级
3.Docker Engine架构:
(参考文档:http://www.infoq.com/cn/articles/docker-source-code-analysis-part1)
4.Docker Machine架构:
Docker Machine 是一种提供管理主机的 工具,我们可以使用 Docker Machine 来安装 Docker Engine 在一个或者多个虚拟系统上
5.理解 Docker三种部件:
Docker 镜像 - Docker images: Docker 镜像是 Docker 容器运行时的只读模板
Docker 仓库 - Docker registeries: Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库(Docker Hub)
Docker 容器 - Docker containers:每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台
6.安装docker:
Docker version检查
7.查找可用docker 镜像:
Docker search XXX
8.下载镜像&查看本地镜像
Docker pull xxx
Docker images
9.运行docker
Docker run –i –t Ubuntu:xxx /bin/bash
运行命令详解:http://blog.csdn.net/kunloz520/article/details/53839237
10.查看运行的docker容器
Docker ps
Docker ps –a
11.启动容器&进入容器&拷贝文件
Docker start (container ID)
Docker attach (container ID) / docker exec -it (container ID) /bin/bash
docker cp D:\docker_test\gradle-2.13-bin.zip d6e3e7845eb2:/tmp
12.制作镜像
方法1: docker commit xxxx:tag (提交当前容器为新的镜像)
方法2: docker build –t xxxx:tag . (通过 Dockerfile 定制镜像)
方法1
docker commit -m=“new” 容器ID (repository name):(tag name)
docker images 查看刚刚建立的images
上传images到公共库:
上传到gitlab:
docker login gitlab.fenqi.im:5500
docker push gitlab.fenqi.im:5500/phoebus/accounting:(tag name)
下载gitlab上的镜像:
Docker pull gitlab.fenqi.im:5500/phoebus/accounting:(tag name)
方法2
Docker 可以通过 Dockerfile 的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建镜像。
Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
########################################
#第一行必须指令基于的基础镜像
From ubutu
#维护者信息
MAINTAINER docker_user docker_user@mail.com
#镜像的操作指令
apt/sourcelist.list
RUN apt-get update && apt-get install -y ngnix
RUN echo “\ndaemon off;”>>/etc/ngnix/nignix.conf
#容器启动时执行指令
CMD /usr/sbin/ngnix
########################################
RUN命令在构建镜像(Build)时执行,这时CMD命令不执行。
CMD命令在镜像RUN命令(docker run)执行时才执行。
########################################
#Version 1.0.1
FROM gitlab.fenqi.im:5500/r_d_qa/at-phoebus:dockertraining
MAINTAINER zhuky “zhuky@fenqi.im”
#设置root用户为后续命令的执行者
USER root
#设置环境变量
ENV PATH /tmp/gradle/gradle-2.13/bin:$PATH
#添加文件 文件放在当前目录下,拷过去会自动解压,可以拷贝文件夹
#ADD gradle-2.13-bin.zip /tmp/
#使用&&拼接命令
#RUN mkdir /tmp/auto/ && cd /tmp/auto/
#对外暴露端口
#EXPOSE 80 8080 1038
#设置工作目录
WORKDIR /tmp/auto/at-plom/plomsuite
#设置启动命令
ENTRYPOINT [“gradle”]
#设置启动参数
CMD [“clean”,“assemble”,“test”,"-i","-Dtestxml=smoketest.xml"]
########################################
更基础的一种dockerfile:
FROM java
MAINTAINER zhuky “zhuky@fenqi.im”
#设置root用户为后续命令的执行者
USER root
#添加文件 文件放在当前目录下,拷过去会自动解压
COPY ./gradle/ /tmp/
#设置环境变量
ENV PATH /tmp/gradle-2.13/bin:$PATH
#使用&&拼接命令
RUN apt-get update && apt-get -y iputils-ping
RUN cd /tmp && mkdir auto && cd /tmp/auto && git clone --progress --verbose https://zhuky:Woshi4311641@gitlab.fenqi.im/r_d_qa/at-plom > /dev/null
#对外暴露端口
#EXPOSE 80 8080
#设置工作目录
WORKDIR /tmp/auto/at-plom/plomsuite
#设置启动命令
ENTRYPOINT [“gradle"]
#设置启动参数
CMD [“clean”,“assemble”,“test”,"-i","-Dtestxml=smoketest.xml"]
Dockerfile 有以下指令选项:
FROM
MAINTAINER
RUN
CMD
支持三种格式:
CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐
CMD command param1 param2,在/bin/sh上执行
CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell中执行)
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点(保持数据同步)
VOLUME [“/data”]
USER
WORKDIR
ONBUILD
Dockerfile使用如下的内容创建了镜像 image-A,其他dockerfile使用from image-a就执行onbuild
Tips:
容器只运行单个应用
将多个RUN指令合并为一个 (RUN apt-get update && apt-get install)
基础镜像的标签不要用latest(docker tag imageid name:tag)
每个RUN指令后删除多余文件(&& rm –rf xxxxxxx)
选择合适的基础镜像(alpine版本最好)
ENTRYPOINT, CMD可以执行shell脚本
ADD对比COPY可以拷贝网络文件,自动解压linux压缩包
Docker的Link机制:
同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip,后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。
docker run –dt –-name=mysql_server –e MYSQL_ROOT_PASSWORD=server mysql
docker run –dt –-name=java_server –link=mysql_server:db java
docker exec –it java_server ping db
docker exec –it java_server tail /etc/hosts
docker exec –it java_server env
Docker间使用volume共享文件(夹):文件改动会实时更新
docker run -ti --rm --name datavol -v D:\code:/tmp java
docker run -it --rm --volumes-from datavol java
windows批量删除docker
docker rm $(docker ps -aq)
docker stop $(docker ps -q) & docker rm $(docker ps -aq)