Docker

安装docker

使用阿里源安装docker镜像,注意需要服务器时间同步

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start
systemctl enable docker.service

镜像加速

阿里云容器镜像服务---->镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像基础操作

搜索镜像

https://hub.docker.com/

docker search mysql

拉取镜像

docker pull mysql:5.7

可以在阿里云创建镜像仓库后进行推送和拉取镜像

docker pull registry.cn-shenzhen.aliyuncs.com/adif0028/nginx_php:74v3

查看镜像

docker images

删除镜像

docker rmi mysql:5.7

导出镜像

docker save zantao -o /opt/zantao.tar.g
查看镜像内容
tar -xf /opt/zantao.tar.gz -C /opt/
镜像导入
docker load < /opt/zantao.tar.gz
在宿主机基于容器 ID 提交为镜像
docker commit -m "nginx image" f0ca10c1f630 nginx:v1

容器操作基础命令

命令格式:docker run [选项] [镜像名] [shell 命令] [参数]
 
启动的容器在执行完 shel 命令就退出了
docker run centos /bin/echo 'hello wold'
从镜像启动一个容器,会直接进入到容器,并随机生成容器 ID 和名称,退出容器后注销
docker run -it centos:7 bash

退出容器不注销

ctrl+p+q
显示正在运行的容器
docker ps
显示所有容器
docker ps -a
删除运行中的容器,即使容正在运行当中,也会被强制删除掉
 
docker rm -f 容器ID

删除所有容器

docker rm -f `docker ps -aq`
映射端口
随机映射端口
docker run -it -P nginx bash
指定端口映射
本地端口 81 映射到容器 80 端口
docker run -p 81:80 --name nginx-test-port1 nginx
一次性映射多个端口+协议
docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
查看 Nginx 容器访问日志
docker logs nginx-test-port5
查看容器已经映射的端口
docker port nginx-test-port5

[root@mon02 ~]# docker port nginx-test-port5
53/udp -> 0.0.0.0:53
53/udp -> :::53
80/tcp -> 0.0.0.0:86
80/tcp -> :::86
443/tcp -> 0.0.0.0:443
443/tcp -> :::443

创建并进入容器,并自定义容器名称
docker run -it --name test-centos7 centos:7 bash
后台启动容器
docker run -d nginx
容器的启动和关闭
docker stop f821d0cd5a99
docker start f821d0cd5a99
批量关闭正在运行的容器
docker stop `docker ps -a -q`
进入到正在运行的容器
docker exec -it f438112a2717 bash
使用 nsenter 命令
nsenter 命令需要通过 PID 进入到容器内部,可以使用docker inspect 获取到容器的 PID
yum install util-linux
docker inspect -f "{{.State.Pid}}" centos-test3
nsenter -t 5892 -m -u -i -n -p
批量删除已退出容器
docker rm -f `docker ps -aq -f status=exited`
监控容器状态
docker stats
指定容器 DNS
Dns 服务,默认采用宿主机的 dns 地址
将参数配置在 docker 启动脚本里面 –dns=223.6.6.6
[root@docker-server1 ~]# docker run -it --rm --dns 223.6.6.6 centos:7 bash

Docker 数据管理

数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,
对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
数据卷的使用类似于Linux下对目录进行的mount操作。
创建mysql容器并把数据映射到宿主机
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysqldata:/var/lib/mysql mysql:5.7 

查看数据

[root@mon02 Dockerfile]# ls /data/mysqldata/
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem
[root@mon02 Dockerfile]# docker exec -it 799b32b4fa12 bash
root@799b32b4fa12:/# ls /var/lib/mysql
auto.cnf    client-cert.pem  ib_logfile0  ibtmp1          private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile1  mysql              public_key.pem   sys
ca.pem        ib_buffer_pool   ibdata1      performance_schema  server-cert.pem
映射的数据是相同的
[root@harbor nginx-1.22.0]# touch /data/mysqldata/1111111
root@87d52302135f:/var/lib/mysql# touch 222222222

root@87d52302135f:/var/lib/mysql# ls
1111111    ca-key.pem        client-key.pem  ib_logfile1  mysql             public_key.pem   sys
222222222  ca.pem        ib_buffer_pool  ibdata1     performance_schema  server-cert.pem  zentao
auto.cnf   client-cert.pem  ib_logfile0     ibtmp1     private_key.pem     server-key.pem

[root@harbor mysqldata]# ls
1111111    ca-key.pem       client-key.pem  ib_logfile0  mysql               public_key.pem   sys
222222222  ca.pem           ib_buffer_pool  ib_logfile1  performance_schema  server-cert.pem  zentao
auto.cnf   client-cert.pem  ibdata1         ibtmp1       private_key.pem     server-key.pem
数据卷的特点及使用
1、数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
2、在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
3、数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
4、在容器里面的写入数据不会影响到镜像本身。
更改容器启动空间大小
[Service]
...
ExecStart=/usr/bin/dockerd 
--storage-driver devicemapper --storage-opt dm.loopdatasize=100G --storage-opt dm.loopmetadatasize=10G --storage-opt dm.fs=ext4 --storage-opt dm.basesize=30G
...

DOCKER最大空间为100G,容器最大空间为30G

白嫖镜像

 

Docker 镜像制作

尽量选择小的基础镜像

如果是动态编译,需将类库一并打包到镜像

DockerFile
ADD #将当前目录下的文件加入到镜像内部,当文件是压缩包时会自动解压。
COPY #将当前目录下的文件加入到镜像内部,无解压功能。
ENV #环境变量,注入到镜像内部。
EXPOSE #容器默认暴露的端口。可以多次添加暴露多个端口
FROM #选择底层镜像,(选择父镜像)特殊情况选择:scratch(空镜像,形成系统或者直接拉起二进制时使用)
LABEL #标签。做说明或者标识用
STOPSIGNAL #停止信号。优雅重启,用的不多
USER #容器内默认用户root,如果需要牢笼政策降级权限运行程序,则需要指定该项
VOLUME #创建容器时会创建相应卷。
WORKDIR #工作目录。如果工作目录不存在则创建
RUN     #具体操作命令行.
CMD     #生成1号进程的默认命令 (/bin/sh -c)
ENTRYPOINT #生成1号进程的默认命令 与cmd区别在于,当两个关键字同时出现时。cmd内容会作为参数传递给entrypoint (/start.sh)
/start.sh /bin/sh 
MAINTAINER #作者信息

Redis镜像制作(静态编译)

准备配置文件和脚本

[root@harbor Dockerfile]# vim /project/Dockerfile/redis.conf

daemonize yes
[root@harbor Dockerfile]# vim /project/Dockerfile/start.sh

#!/bin/bash
redis-server /data/redis.conf
tail -f /dev/null

编写Dockerfile

[root@harbor Dockerfile]# vim /project/Dockerfile/Dockerfile 

FROM centos:7
MAINTAINER panda-wei
WORKDIR /data
COPY redis.conf /data
COPY start.sh /data
ADD redis-5.0.14.tar.gz /data
RUN yum install -y gcc gcc-c++ make && \
    cd redis-5.0.14 && \
    make && make install && \
    chmod a+x /data/start.sh && \
    yum remove -y gcc gcc-c++ make
FROM ubuntu
WORKDIR /data
COPY --from=0 /usr/local/bin/* /usr/local/bin/
COPY --from=0 /data/start.sh /data
COPY --from=0 /data/redis.conf /data
EXPOSE 6379
CMD ["/data/start.sh"]
ENTRYPOINT ["/bin/sh","-c"]

制作镜像

[root@harbor Dockerfile]# docker build -t redis:v1 .

测试镜像是否可用

docker run -d redis:v1
docker exec -it 72319623d7b8 bash
root@72319623d7b8:/data# redis-cli 
127.0.0.1:6379> ping
PONG

Nginx镜像制作(动态编译)

FROM centos:7
MAINTAINER panda-wei
WORKDIR /data
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY start.sh /data
ADD nginx-1.22.0.tar.gz /data
RUN yum install  gcc  zlib zlib-devel  pcre pcre-devel openssl openssl-devel -y > /dev/null && \
    groupadd  -g 88 nginx && useradd  -g nginx -M -s /sbin/nologin -u 88 nginx && \
    cd /data/nginx-1.22.0 && \
    CONFIG="\
      --user=nginx \
      --group=nginx \
      --prefix=/usr/local/nginx \
      --error-log-path=/var/log/nginx/error.log \
      --http-log-path=/var/log/nginx/access.log \
      --with-http_stub_status_module \
      --with-http_sub_module \
      --with-http_ssl_module \
      --with-pcre \
      --with-stream \
      " \
    && ./configure $CONFIG && make && make install && \
    chmod a+x /data/start.sh
FROM registry.cn-shenzhen.aliyuncs.com/adif0028/centos:v7
COPY --from=0 /lib /lib
COPY --from=0 /lib64 /lib64
COPY --from=0 /usr/local/nginx /usr/local/nginx
WORKDIR /data
COPY --from=0 /data/start.sh /data/start.sh
RUN groupadd  -g 88 nginx && useradd  -g nginx -M -s /sbin/nologin -u 88 nginx && \
    mkdir /usr/local/nginx/conf/vhosts && \
    sed -i '$i include vhosts/*.conf;' /usr/local/nginx/conf/nginx.conf && \
    ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx && \
    mkdir /var/log/nginx &&\
    chown nginx.nginx -R /var/log/nginx
EXPOSE 80
CMD ["/data/start.sh"]
ENTRYPOINT ["/bin/sh","-c"]
docker run -d  -p 80:80 nginx:v1

跨主机容器间通信macvlan

准备两台docker服务器进行测试

在两台虚拟机进行

创建macvlan网络,可以自定义ip地址

docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=ens33 macvlan_1

设置eth33的网卡为混杂模式

ip link set eth1 promisc on

创建使用macvlan网络的容器

docker run -it --network macvlan_1 --ip=10.0.0.200 centos:7 bash
docker run -it --network macvlan_1 --ip=10.0.0.201 centos:7 bash 

测试是否相通

[root@b90803e9fbf1 /]# ping 10.0.0.201
PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data.
64 bytes from 10.0.0.201: icmp_seq=1 ttl=64 time=0.393 ms
64 bytes from 10.0.0.201: icmp_seq=2 ttl=64 time=0.279 ms

Docker Compose 单机编排

安装

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose 

本次使用版本

[root@mon02 compose]# docker-compose -version
docker-compose version 1.24.0, build 0aa59064
mkdir -p /project/compose
官方二进制下载地址:

使用Compose部署禅道

编写yml文件

[root@mon02 compose]# vim docker-compose.yml 

version: '3'
services:
  db:
    image: mysql:5.7
    container_name: mysql
    restart: always
    tty: true
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    volumes:
      - /data/mysqldata:/var/lib/mysql
    networks:
      - zentao
  web:
    image: zentao:v1
    container_name: zentao
    restart: always
    tty: true
    depends_on:
      - db
    ports:
      - 80:80
    networks:
      - zentao
volumes:
  mysqldata:
networks:
  zentao:

后台启动容器

docker-compose up -d

进入容器后修改Nginx和php配置文件

[root@mon02 compose]# docker exec -it zentao bash

[root@4f50786b50d4 data]# vi /usr/local/nginx/conf/nginx.conf
 
   server {

     root /data/zentaopms/www;

[root@4f50786b50d4 data]# vi /usr/local/php/etc/php.ini
session.save_path = "/tmp"

[root@4f50786b50d4 data]# nginx -s reload
[root@4f50786b50d4 data]# /etc/init.d/php-fpm restart

harbor私有镜像平台

服务端配置至少 2核4G

注意版本,本次使用版本:

harbor    v2.5.2
docker-compose    v2.5.1

在harbor官网下载相应版本 https://goharbor.io/

使用手册 https://goharbor.io/docs/2.6.0/install-config/

设置服务端hostname

hostnamectl set-hostname harbor

服务端安装harbor

tar -xf harbor-offline-installer-v2.5.2.tgz -C /opt

进入目录

cd /opt/harbor/

修改配置文件

cp harbor.yml.tmpl harbor.yml

vim harbor.yml

hostname: 192.168.88.20

#不需要https时将以下注释
# https related config
#https:
#  # https port for harbor, default is 443
#  port: 443
#  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

harbor_admin_password: 123456

本次使用http,将配置文件ip设置为服务器ip

[root@harbor harbor]# vim /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"],
  "insecure-registries" : ["192.168.88.20"]
}

修改config.json文件

[root@harbor harbor]# vim ~/.docker/config.json 

{
        "auths": {
                "registry.cn-guangzhou.aliyuncs.com": {
                        "auth": "ZndlZnczMzM6d2VpMTY0MjI5ODQ0OQ=="
                }
        }
}

重启docker

systemctl restart docker

安装harbor,可以多次运行脚本

[root@harbor harbor]# ./install.sh

当修改harbor配置时可以使用 ./prepare 脚本

查看harbor是否正常运行

[root@harbor harbor]# docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS                    PORTS                                   NAMES
cc9ddd808b15   goharbor/harbor-jobservice:v2.5.2    "/harbor/entrypoint.…"   20 minutes ago   Up 19 minutes (healthy)                                           harbor-jobservice
94549eac7cc9   goharbor/nginx-photon:v2.5.2         "nginx -g 'daemon of…"   20 minutes ago   Up 19 minutes (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp   nginx
d068a04f5547   goharbor/harbor-core:v2.5.2          "/harbor/entrypoint.…"   20 minutes ago   Up 20 minutes (healthy)                                           harbor-core
d0a4d14ae7d3   goharbor/harbor-registryctl:v2.5.2   "/home/harbor/start.…"   20 minutes ago   Up 20 minutes (healthy)                                           registryctl
4dca4f8265b6   goharbor/harbor-db:v2.5.2            "/docker-entrypoint.…"   20 minutes ago   Up 20 minutes (healthy)                                           harbor-db
c7313b895191   goharbor/harbor-portal:v2.5.2        "nginx -g 'daemon of…"   20 minutes ago   Up 20 minutes (healthy)                                           harbor-portal
b139558eeb7c   goharbor/redis-photon:v2.5.2         "redis-server /etc/r…"   20 minutes ago   Up 20 minutes (healthy)                                           redis
6f977686f776   goharbor/registry-photon:v2.5.2      "/home/harbor/entryp…"   20 minutes ago   Up 20 minutes (healthy)                                           registry
87ad2662cda7   goharbor/harbor-log:v2.5.2           "/bin/sh -c /usr/loc…"   20 minutes ago   Up 20 minutes (healthy)   127.0.0.1:1514->10514/tcp               harbor-log

登录web界面新建项目

 使用http时在客户端修改配置

[root@harbor-agent ~]# vim /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"],
   "insecure-registries" : ["192.168.88.20"]

}
systemctl restart docker.service

修改镜像名

docker tag bitnami/redis 192.168.88.20/redis/redis:v1

客户端登录

docker login 192.168.88.20

推送镜像

docker push 192.168.88.20/redis/redis:v1

 

posted @ 2022-11-02 18:38  kivtx  阅读(61)  评论(0)    收藏  举报