Docker 使用笔记

Docker 使用笔记

Jul 2, 2018
DevOps

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 实现。


  1. https://github.com/Acris/docker-shadowsocks-libev ↩︎

本文以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

上一篇:Django 的中间件执行顺序

下一篇:Gitlab CI/CD 实践总结