Docker

Posted by deng liuyan on July 28, 2018

docker的主要用途

提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

组建微服务架构。

docker principle

Linux 容器的一种封装,提供简单易用的容器使用接口

需要用户具有 sudo 权限

服务器—-客户端架构

docker using

可docker hub里抓取images;

1
docker image pull ***

如mysql docker及redis docker

新建.dockerignore

里面填写的路径要排除,不打包进入 image 文件

创建 Dockerfile 文件生成image

如下例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#继承image,也可继承官方的image,建议先pull下来
FROM django:1.9.6-python2

MAINTAINER Liuyan Deng <mail_address>

#设置环境变量代理
#ENV HTTP_PROXY ***
#ENV HTTPS_PROXY ***
#ENV FTP_PROXY ***
#ENV http_proxy ***
#ENV https_proxy ***
#ENV ftp_proxy ***
ENV environment test

#安装包
RUN apt-get update && apt-get install -y \
        ca-certificates \
        vim \
        cron \
        curl \
        libsasl2-dev \
        libldap2-dev \
        libssl-dev \
        --no-install-recommends && rm -rf /var/lib/apt/lists/*


ADD requirements.txt /opt/

#可run一些安装包
RUN mkdir -p /usr/lib/jvm
RUN cp -a /opt/jdk1.8.0_121 /usr/lib/jvm

RUN cd /opt && unzip instantclient-basic-linux.x64-11.2.0.4.0.zip && \
    unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip && \
    cd /opt/instantclient_11_2 && \
    ln -s libclntsh.so.11.1 libclntsh.so

#RUN pip install --upgrade pip

RUN pip install -r /opt/requirements.txt

ENV DB_NAME1 tmp
ENV DB_USER1 tmp
ENV DB_PASSWORD1 tmp
ENV DB_HOST1 tmp
ENV DB_PORT1 tmp
ENV REDIS redis://***

RUN echo "Asia/Shanghai" > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata

WORKDIR /opt/code_dir/

#添加当前文件夹入docker,也可在docker run的时候通过-v映射,这样可直接reload更新代码
#ADD api api/
#ADD media media/
#ADD project project/
#ADD static static/
#ADD status status/
#ADD templates templates/
#ADD manage.py manage.py

ADD resources/uwsgi/supervisord.conf /etc/supervisord.conf
ADD resources/uwsgi/uwsgi.ini /opt/uwsgi.ini
ADD resources/uwsgi/celerybeat.conf /etc/celerybeat.conf
ADD resources/uwsgi/run-app.sh /run-app.sh

RUN chmod u+x /run-app.sh

VOLUME /media

#将容器 9090 端口暴露出来, 允许外部连接这个端口
EXPOSE 9090

# run celery by root
ENV C_FORCE_ROOT true
RUN mkdir -p /opt/log

#
CMD /run-app.sh

docker command

docker image build

-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest`。最后的那个点表示 Dockerfile 文件所在的路径

1
docker image build -t koa-demo:0.0.1 .
docker images

-a 参数表示显示隐藏image

docker container run

-p: 端口映射

-e: 设置环境变量

-v:路径映射

—name: container name

—tmpfs:临时文件系统

1
docker run -d -p 9091:9090 -e DB_NAME1=*** -e DB_USER1=*** -e DB_PASSWORD1=mrcf4034vpfr -e DB_HOST1=10.80.121.169 -e DB_PORT1=1521  -e DB_NAME2=*** -e DB_USER2=*** -e DB_PASSWORD2=*** -e DB_HOST2=*** -e DB_PORT2=1521 -e USERNAME=** -e PASSWORD=** -e JOBNAME=*** -e REDIS=redis://*** -e CSA_USERNAME=*** -e CSA_PASSWORD=*** -e environment=production -e NO_PROXY="****" -v local_path:docker_path  --tmpfs /var/tmp/ --tmpfs /tmp/ --tmpfs /run/ --name container_name image_name

docker & iptables

容器之间相互访问,需要两方面的支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 docker0 网桥上。

  • 本地系统的防火墙软件 – iptables 是否允许通过。

访问所有端口

当启动 Docker 服务(即 dockerd)的时候,默认会添加一条转发策略到本地主机 iptables 的 FORWARD 链上。策略为通过(ACCEPT)还是禁止(DROP)取决于配置--icc=true(缺省值)还是 --icc=false。当然,如果手动指定 --iptables=false 则不会添加 iptables 规则。

可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/docker/daemon.json 文件中配置 {"icc": false} 来禁止它。

iptables -nL :查看当前系统的规则