Docker 使用笔记
7月 2, 2018
Docker 介绍 #
Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker 允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。
简单理解就是:一次打包,到处执行。
命令 #
Run #
部署一个 shadowsocks1
docker run -d \
-e METHOD=aes-256-gcm \
-e PASSWORD=thisispasswd \
--name=shadowsocks-libev \
-p 8388:8388/tcp \
-p 8388:8388/udp \
--restart=always \
acrisliu/shadowsocks-libev
Dockerfile #
Python 打包 #
FROM python:3.6
WORKDIR /data/src
COPY ./requirements.txt /data/src/requirements.txt
RUN pip3 install -r requirements.txt
COPY . /data/src
COPY .env.example .env
COPY ./docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/bash
case "$1" in
runserver)
exec python3 manage.py "$@"
;;
esac
if [ -z $1 ] ; then
exec gunicorn -b 0.0.0.0:8000 -w 4 -t 90 -p /var/run/project.pid project.wsgi:application
fi
Golang 打包 #
go 不像 Python 需要解释执行,go 可以直接通过编译后的二进制文件执行,这种情况下可以先使用一个打包镜像进行打包,最后通过一个新的镜像只保存最终的二进制文件,从而可以大幅度降低镜像大小,加快部署速度。
FROM golang:1.12.17 AS build-env
ADD . /go/src/gitlab.com/tcitry/gogogo
WORKDIR /go/src/gitlab.com/tcitry/gogogo
RUN go build -o /build/gogogo main.go
FROM golang:1.12.17
COPY --from=build-env /build/gogogo /data/src/
COPY conf/test.toml /data/src/
COPY entrypoint.sh /data/src/
EXPOSE 5555
ENTRYPOINT ["/data/src/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
mv test.toml config.toml
if [ -z $COMMAND ]; then
if [ ! -z $1 ] ; then
COMMAND=$@
fi
exec /data/src/gogogo $COMMAND
else
exec /data/src/gogogo $COMMAND
fi
docker compose #
Compose 是用于定义和运行多个容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序需要的所有服务,然后通过使用一个命令,就可以创建并启动所有服务。
docker swarm #
Swarm 不仅仅有 Compose 的功能,同时 Swarm Mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。
四种网络模式 #
bridge 模式 #
默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
–net=bridge
host 模式 #
容器和宿主机共享Network namespace。
–net=host
container 模式 #
容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
–net=container:NAME_or_ID
none 模式 #
该模式关闭了容器的网络功能。
–net=none
Docker 怎么隔离资源 #
底层通过 Linux 的 namespace 和 cgroups 实现。