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 :查看当前系统的规则