Docker-Ce 教程

Angels by @daydreamerro, Romania

使用Docker容器,可以快速的在其它地方搭建和开发应用程序,而不必为关心程序运行的环境。

Docker容器将软件及其依赖库安装到一个标准镜像中,其中包括软件运行时的所需要的 代码、运行时、系统工具和库等等。

这保证了我们的应用程序将始终运行在一个相同的环境下,并且与他人共享此镜像非常简单。

安装 Docker-CE

系统仓上的docker.io版本非常老了,版本号为 1.XXX。
docker-ce是版本号为 17.XXX or 18.XXX。

1
2
3
4
5
6
7
:~$ sudo apt-get -y install apt-transport-https ca-certificates software-properties-common
:~$ curl -fsSL get.docker.com | sed '/Aliyun/,/;;/{
/;;/a\
Singhua)\
DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"\
;;
}' > get-docker.sh && sudo sh get-docker.sh --mirror Singhua

上面的代码,我们手动添加了清华大学Docker-CE镜像,因为它的下载速度快且问题少。

当然我们也可以手动添加其它版本的Docker-CE镜像源

1
2
3
4
# 树莓派
:~$ echo '#deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable
deb [arch=armhf] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/raspbian stretch stable
' > /etc/apt/sources.list.d/docker.list

给于普通用户控制 Docker 的权限

1
:~$ sudo usermod -aG docker [user's name]

上面的命令,将普通用户添加至 docker 组。
当我们退出用户并重新登录后,管理Docker时就不用再使用sudo来提权了。

1
2
3
4
5
6
:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 72300a873c2c 3 weeks ago 64.2MB
alpine 3.8 c8bccc0af957 8 weeks ago 4.41MB
:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Docker 使用主机网络

众所周知,Docker的运行性能非常棒,与本机的速度差不多。
Docker的网络性能相对主机差了不少。主要是由于Docker的网络层使用了虚拟网卡,多了一层 NAT 所引起的。

当然,一般的程序网络流量不太大,使用Docker默认的虚拟网卡上网并无多大影响,但当在Docker容器中运行网站或BT这种大流量服务时,虚拟网卡的缺陷就显现出来了。

解决此问题,我们只需要让Docker容器使用主机网络来进行通信即可。当然,这样做会使Docker的安全性有所下降,毕竟容器的网络堆栈没有与Docker主机隔离(该容器共享主机的网络名称空间),在容器中也可以获取到主机的网络信息。
例如,我们运行一个使用了主机网络并绑定80端口的容器,该容器的应用程序可能过主机IP地址的80端口进行访问。

注意:假设容器使用了主机网络,那么 Docker 的 端口映射 将不起作用,并且-p--publish-P--publish-all选项将被忽略,并产生一个警告:

WARNING: Published ports are discarded when using host network mode.

主机网络模式 linux 可以使用,其它平台不支持此模式,如:MAC版的Docker,Windows版的Docker等等。

使用--net=host--network host选项来让容器使用主机网络模式。

例子

使用nginx容器绑定主机的80端口。

1
2
3
4
5
6
7
# Method 1
:~$ docker run --rm -d --network host --name my_nginx nginx
# Method 2
:~$ docker run --rm -d --net=host --name my_nginx nginx
:~$
:~$ sudo netstat -tulpn | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 522/nginx
  • --rm: 当容器退出或停止时删除此容器。
  • -d: 在后台运行容器
  • --network host: 使用主机网络

使用Dockerhub的镜像服务器

在中国,从 Dockerhub 下载镜像时速度非常慢。所以这里我们使用 Dockerhub 的国内镜像来提高下载速度。

镜像名称 地址
Azure https://dockerhub.azk8s.cn
Docker 官方 https://registry.docker-cn.com
163 http://hub-mirror.c.163.com
阿里云 (需要登录) https://<your_code>.mirror.aliyuncs.com
1
2
3
4
5
6
7
:~$ sudo mkdir -p /etc/docker
:~$ sudo cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://dockerhub.azk8s.cn"]
}
EOF
:~$ sudo systemctl restart docker

检测镜像设置是否生效:

1
2
3
4
5
6
:~$ docker info
...
...
Registry Mirrors:
https://dockerhub.azk8s.cn/
...

Docker 镜像

ipsec_vpn_server

There are two services running: Libreswan (pluto) for the IPsec VPN, and xl2tpd for L2TP support.

The default IPsec configuration supports:

  • IKEv1 with PSK and XAuth (“Cisco IPsec”)
  • IPsec/L2TP with PSK

The ports that are exposed for this container to work are:

  • 4500/udp and 500/udp for IPsec

Install

For use on Raspberry Pis (ARM architecture), you must first build this Docker image on your RPi using instructions from Build from source code, instead of pulling from Docker Hub.

  • Build from source code
  • if you want to modify the source code:
    1
    2
    3
    4
    :~$ git clone https://github.com/hwdsl2/docker-ipsec-vpn-server.git
    :~$ cd docker-ipsec-vpn-server
    ....
    :~$ sudo docker build -t hwdsl2/ipsec-vpn-server .
  • use this if not modifying the source code:
    1
    :~$ sudo docker build -t hwdsl2/ipsec-vpn-server github.com/hwdsl2/docker-ipsec-vpn-server.git
  • in x86_64 architecture, install with Docker Hub
    1
    2
    3
    :~$ sudo docker search ipsec-vpn-server
    ...
    :~$ sudo docker pull hwdsl2/ipsec-vpn-server

ipsec-vpn-server 配置

Set Environment variables:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
:~$ nano ./vpn.env
# Define your own values for these variables
# - DO NOT put "" or '' around values, or add space around =
# - DO NOT use these special characters within values: \ " '
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password

# (Optional) Define additional VPN users
# - Uncomment and replace with your own values
# - Usernames and passwords must be separated by spaces
VPN_ADDL_USERS="additional_username_1 additional_username_2"
VPN_ADDL_PASSWORDS="additional_password_1 additional_password_2"

# (Optional) Use alternative DNS servers
# - By default, clients are set to use Google Public DNS
# - Example below shows using Cloudflare's DNS service
# VPN_DNS_SRV1=1.1.1.1
# VPN_DNS_SRV2=1.0.0.1

Note: In your env file, DO NOT put “” or ‘’ around values, or add space around =. DO NOT use these special characters within values: \ “ ‘.A secure IPsec PSK should consist of at least 20 random characters.

run ipsec-vpn-server and configure

  1. run the image of docker, bind vpn.env to local file
    1
    2
    3
    4
    5
    6
    7
    8
    9
    :~$ sudo docker run \
    --name ipsec-vpn-server \
    -v "$(pwd)/vpn.env:/opt/src/vpn.env:ro" \
    --restart=always \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -d --privileged \
    hwdsl2/ipsec-vpn-server
    # -v "local file:file in docker:file permission"
  2. Bash shell inside container
    1
    2
    3
    4
    5
    :~$ sudo docker exec -it ipsec-vpn-server env TERM=xterm bash -l
    root@docker:~$ apt-get update && apt-get -y install nano
    root@docker:~$ ...some other command
    root@docker:~$ exit
    :~$ sudo docker restart ipsec-vpn-server
  3. Retrieve VPN login details
  • show the vpn name,password,ipsec-preshare-key
    1
    :~$ sudo docker logs ipsec-vpn-server
  • Check server status
    1
    :~$ sudo docker exec -it ipsec-vpn-server ipsec status
  • display current established VPN connections
    1
    :~$ sudo docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
  • add, edit or remove VPN user accounts
  1. update your env file,
  2. restart the Docker container
    1
    :~$ sudo docker restart ipsec-vpn-server

svn server image 镜像

具体查看 SVN Tutorial

Transmisson-Daemon 镜像

具体查看 Transmission-Daemon

KMS 服务镜像

查看 KMS Server


References:
Docker.com
Angles by @daydreamerro
docker-ipsec-vpn-server
docker-svn-server
docker-transmission-daemon
docker-kms