docker学习笔记

关于Docker

版本

Docker版本

  • Docker Community Edition(CE)-社区版

  • Docker Enterprise Edition(EE)-企业版

Docker Engine版本

  • Docker Engine Enterprise

  • Docker Engine Community。

平台支持

桌面版

平台 x86_64
Docker Desktop for Mac (macOS)
Docker Desktop for Windows (Microsoft Windows 10)

服务器版

Platform x86_64 / amd64 ARM ARM64 / AARCH64 IBM Power (ppc64le) IBM Z (s390x)
CentOS
Debian
Fedora
Ubuntu

Docker Toolbox

docker在linux下直接安装Docker Engine即可。但是在Windows、MacOS下需要用Docker Toolbox提供的Docker Machine创建虚拟机(boot2docker)。

安装教程

为Windows和MacOS提供的docker安装器,包含以下工具:

  • Docker Machine,提供docker-machine命令
  • Docker Engine,提供docker命令
  • Docker Compose,提供docker-compose命令
  • Kitematic,Docker GUI
  • Shell,提供Docker命令行环境的
  • Oracle VirtualBox

Kitematic提供图形界面,方便容器的管理,使用教程

1
2

问题汇总

容器时区设置

在使用Docker Toolbox时,用docker-machine创建的boot2docker虚拟机时区为UTC,导致其中运行的容器时区与本地时区也不一致。

解决方案如下:

docker-compose模式

environment:
  - TZ=Asia/Shanghai

docker run模式

docker run -e "TZ=Asia/Shanghai"

容器网络设置

容器默认是动态IP,有时我们需要静态IP。

docker-compose模式

指定子网网关、网段,及容器静态IP。下例会自动创建名称为docker-hadoop_net的网络。

version: "2"

services:
  namenode:
    image: mysql
    container_name: mymysql
    environment:
      - TZ=Asia/Shanghai
    networks:
      net:
        ipv4_address: 172.18.100.101

networks:
   net:
      ipam:
         config:
           - subnet: 172.18.100.0/24
             gateway: 172.18.100.1

docker run模式

docker run -e TZ="Asia/Shanghai" --privileged -itd -h hadoop01.com --name hadoop01 --network=mynet --ip 172.18.12.1 centos /usr/sbin/init

主机直连容器

MacOS

在Docker Desktop for Mac、Docker Machine环境中均不能ping通容器。按照网上的方法添加route,将容器ip路由到docker machine,没有响应。

虚拟机(CentOS)

<font color='red'>!!!虚拟机添加Host-Only网卡,并将混杂模式设置为全部允许。</font>

1、安装VirtualBox,添加CentOS7虚拟机,安装Docker CE。

2、配置虚拟机网络,与宿主机互通。

3、管理-主机网络管理器,添加虚拟网卡vboxnet0

vboxnet0在宿主机添加虚拟网卡,为虚拟机分配IP,宿主机与虚拟机在同一网段。

1

4、VirtualBox-偏好设置-网络

NatNetwork为VirtualBox中安装的虚拟机分配IP,与宿主机隔离。

4

5、配置虚拟机网卡1(NAT网络)

2

6、配置虚拟机网卡2(仅主机网络)

<font color='red'>!!!混杂模式设置为全部允许</font>

3

7、宿主机添加路由表

在虚拟机中查看docker容器IP,步骤如下:

# 查看network
~ docker network ls
NETWORK ID      NAME    DRIVER    SCOPE
8c4e3d387a7a    bridge  bridge    local

# 查看network网段和容器ip
~ docker inspect 8c4e3d387a7a
[
    {
        "Name": "bridge",
        "Id": "8c4e3d387a7a5c",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Containers": {
            "46cba393befd1f6": {
                "Name": "registry",
                "EndpointID": "3530fa3f129c7b6",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        }
    }
]

# 例如:network网段为172.17.0.0/16,虚拟机IP为192.168.56.102
~ route -n add 172.17.0.0/16 192.168.56.102

8、至此大功告成

看,ping成功了

~ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=63 time=0.365 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=63 time=0.428 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=63 time=0.392 ms