Keen的博客

记录所思、所想、所遇

欢迎来到我的个人站~


Docker笔记

1. CentOS下安装docker教程

参考:https://docs.docker.com/install/linux/docker-ce/centos/

# 安装必要工具集
$ yum -y install -y yum-utils device-mapper-persistent-data lvm2

# 下载docker源(注意,yum-config-manager是一个python程序,仅支持python2,如果是python3的话,需要改一下这个文件的头部)
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装docker
$ yum -y install docker-ce docker-ce-cli containerd.io

# 启动docker
$ systemctl start docker

2. docker使用的代理问题

# 在centos中,/etc/profile中可以设置全局的网络代理,但是docker却不会使用此代理上网。需要设置单独的代理
# 新建一个服务目录
$ mkdir /etc/systemd/system/docker.service.d

# 新建一个配置文件
$ vim /etc/systemd/system/docker.service.d/http-proxy.conf

# 填写如下内容
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="HTTPS_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

3. 通过docker安装一个centos系统

# 安装7.3的centos版本
$ docker pull centos:7.3.1611

# 启动7.3系统
$ docker run -t -i centos:7.3.1611 /bin/bash

4. 通过Dockerfile管理系统部署

# 在host机器任意地方,建一个目录DockerApp1
$ mkdir /opt/DockerHome/DockerApp1

# 创建一个Dockerfile文件
$ vim Dockerfile

# 写下以下内容(主要使用FROM命令和RUN命令)
FROM centos:7.3.1611
MAINTAINER Docker Keenjin <xxx@qq.com>
COPY epel.repo /etc/yum.repos.d/
RUN yum -y install wget
RUN wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
RUN yum -y upgrade
RUN yum -y install epel-release
RUN yum -y install net-tools zip unzip lrzsz vim
RUN yum -y install go

# 编译docker
docker build -t workos:v1 .

# 运行docker
docker run -it workos:v1

# 注意:
# 使用RUN的时候,每一条RUN运行,都会启动一个bash,执行完命令,会自动commit,这样镜像的层级就新增一层。
# 由于层级的增加会导致无用的浪费,最好RUN尽可能少,把命令都放在一个bash里面执行完成,如下:
RUN yum -y install wget \
    && yum -y upgrade \
    && wget xxxxxxx
# Dockerfile案例
FROM centos:latest
MAINTAINER Docker Keenjin <Keenjin@tencent.com>

# 先修改环境变量,确保可以正常联网
ENV http_proxy http://web-proxy.tencent.com:8080
ENV https_proxy http://web-proxy.tencent.com:8080

# 安装基础设备
RUN yum -y install wget

# 安装镜像源和必要工具集
COPY epel.repo /etc/yum.repos.d/
RUN wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7 \
    && yum -y upgrade \
    && yum -y install epel-release \
    && yum -y install net-tools zip unzip lrzsz vim iproute

# 安装go开发套件
RUN wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz \
    && tar -C /usr/local -xzf go1.12.6.linux-amd64.tar.gz
ENV PATH $PATH:/usr/local/go/bin
ENV GOROOT /usr/local/go
RUN mkdir /opt/go
ENV GOPATH /opt/go

# 安装rabbitmq
RUN curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash \
    && curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | bash \
    && yum -y install erlang \
    && yum -y install rabbitmq-server

5. Docker不要跑多个进程

# 今天本来想把docker当作虚拟机使用,发现这里踩坑比较严重。
# docker本质是当作一个微服务使用,本质而言,一个docker运行一个服务,只是我们把所有的相关依赖,全部可以通过Dockerfile打包起来,这样一个容器一个服务,就可以跑在所有其他任何地方。

6. Docker的常用命令

# 查看当前有哪些镜像(通过docker pull拉取下来的,以及通过docker build根据Dockerfile构造的)
docker image ls
# 针对镜像的删除操作
docker image rm -f xxx(这里xxx可以是repository:tag,也可以是imageid,其中,imageid可以只填写部分)
# 查看当前运行的容器进程
docker ps -a
# 查看容器的所有配置信息(比如网络、ip等)
docker inspect 容器id
# 进入已有容器
docker exec -it containerid /bin/bash

7. Docker下rabbitmq实战

# 对于一般场景,使用rabbitmq:latest即可,但是如果想要management,能通过web访问rabbitmq,就需要使用rabbitmq:3-management
docker pull rabbitmq:3-management

# 运行rabbitmq容器(-d表示后台运行,-rm表示容器退出后自动清除,--hostname是由于rabbitmq会根据主机名创建节点,如果用默认,可能多个节点名一致不好区分。)
docker run -d --rm --hostname keen-master --name rabbit-01 rabbitmq:3-management

# 按照上面的方式,如果想要访问docker内的rabbitmqmgr,在虚拟机外部(windows机器),建立路由表,能将172.17.0.0网段的所有请求,都转到192.168.2.132(docker宿主机)上去。
# 这种方式,直接访问http://172.17.0.2:15672即可
route add 172.17.0.0 mask 255.255.255.0 192.168.2.132

# 如果不使用路由表,也可以直接建立端口转发,使用-p参数,如下,直接使用http://192.168.2.132:8080,就可以访问docker内的rabbitmq web服务
docker run -d --rm --hostname keen-master --name rabbit-01 -p 8080:15672 rabbitmq:3-management

# 如果不设置ip,docker会自动分配172号段的ip地址给每一个容器。如果想要ip自己可控,则可以自己传递一个固定ip地址进去
# 参考这里的:https://www.jianshu.com/p/19cd3654e4a4
# linux下的网络模型,简单来说,有网桥和主机模式两种。docker默认使用的网桥模型,docker启动的时候,就建立了默认网桥,如下:
[root@client-centos7 dockerhome]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4a7b5cd62362        bridge              bridge              local
64187f1770f6        host                host                local
324eb80ac409        none                null                local
# 其中,bridge是docker默认建立的网桥,通过docker network inspect bridge,可以查看详情,如下:
[root@client-centos7 dockerhome]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "4a7b5cd623620a809a8b3fc1d766591b8eaf1dc18b6a0d45e20b15fb3ecd607f",
        "Created": "2019-06-12T08:02:17.546758645-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
# 可以看到,子网是172.17号段,如果使用这个默认的网桥,来设置固定ip地址,如下:
[root@client-centos7 dockerhome]# docker run -d --rm --hostname keen-master --name rabbit-01 -p 8080:15672 --network bridge --ip 172.17.0.100 rabbitmq:3-management
07da4b8138ae70d8760f30643d1dcb88b9145c458a5e429db87774d5819458ad
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
# 很明显,可以看到,我们就不能使用默认的网桥,如果要指定固定ip,就必须使用自定义网桥。这里大概意思是,默认网桥留给自动分配ip使用。
# 创建自定义网桥,如下:
[root@client-centos7 dockerhome]# docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.1 keennet
459e55e82c169ada4d877c1809f1e730fa498cd6c0b4de0c8ffa09cd15d6681f
[root@client-centos7 dockerhome]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4a7b5cd62362        bridge              bridge              local
64187f1770f6        host                host                local
459e55e82c16        keennet             bridge              local
324eb80ac409        none                null                local
# 这样,就建立的自己的网桥keennet,查看详情如下:
[root@client-centos7 dockerhome]# docker network inspect keennet
[
    {
        "Name": "keennet",
        "Id": "459e55e82c169ada4d877c1809f1e730fa498cd6c0b4de0c8ffa09cd15d6681f",
        "Created": "2019-06-21T03:40:32.064733752-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
# 也可以使用ifconfig查看
[root@client-centos7 dockerhome]# ifconfig
br-459e55e82c16: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.0.1  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 02:42:fa:82:1b:7a  txqueuelen 0  (Ethernet)
        RX packets 2203683  bytes 3100652975 (2.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1337767  bytes 113125240 (107.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:f7:dd:7e:69  txqueuelen 0  (Ethernet)
        RX packets 821346  bytes 37828065 (36.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1587502  bytes 2531736409 (2.3 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.132  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::9422:95b:a1fc:ad87  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:49:2a:69  txqueuelen 1000  (Ethernet)
        RX packets 2203683  bytes 3100652975 (2.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1337767  bytes 113125240 (107.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 121217  bytes 10667096 (10.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 121217  bytes 10667096 (10.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:7b:4d:e7  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 第一个就是我们的网桥信息。这样,就可以用我们自定义的网桥,来设置固定ip
docker run -d --rm --hostname keen-master --name rabbit-01 -p 8080:15672 --network keennet --ip 192.168.0.100 rabbitmq:3-management

# 因为默认的账户guest,只能localhost访问(宿主机内的虚拟机访问除外),所以我们也需要设置用户名和密码
docker run -d --rm --hostname keen-master --name rabbit-01 -p 8080:15672 --network keennet --ip 192.168.0.100 --env RABBITMQ_DEFAULT_USER=keen-rabbit --env RABBITMQ_DEFAULT_PASS=keen123 rabbitmq:3-management

8. Docker镜像迁移

# 列出已有镜像
[root@client-centos7 centos7.6]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rabbitmq            3-management        6ffc11daa8d0        5 days ago          186MB
rabbitmq            latest              35d90e3cc645        5 days ago          156MB
centos              latest              9f38484d220f        3 months ago        202MB

# 镜像备份
[root@client-centos7 centos7.6]# docker save 6ffc11daa8d0 | gzip > rabbitmq-3-management.tar.gz

# 镜像还原
[root@localhost ~]# docker load -i rabbitmq-3-management.tar.gz

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少