美文网首页
docker基础

docker基础

作者: 挑战_bae7 | 来源:发表于2021-01-04 15:23 被阅读0次

    1.docker安装

    参考文档
    https://docs.docker.com/engine/install/centos/ 
    1.安装docker 
    sudo yum remove docker docker-client docker-client-latest  docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce docker-ce-cli containerd.io
    2.国内源
    https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11uPj8mi
    # step 1: 安装必要的一些系统工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    # Step 2: 添加软件源信息
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # Step 3: 更新并安装Docker-CE
    sudo yum makecache fast
    sudo yum -y install docker-ce
    # Step 4: 开启Docker服务
    sudo service docker start
    
    图片.png

    2.docker镜像 docker image

    2.1 搜索拉取镜像

    docker search centos
    docker pull centos:7.5.1804
    docker pull nginx
    

    2.2 查询镜像

    docker images
    docker image ls 显示镜像 跟上面命令一样
    docker image ls --no-trunc 查询镜像ID的详细信息
    docker images -q  仅显示镜像ID 
    docker image ls -q 仅显示镜像ID  跟上面命令一样
    docker inspect ID/name:tag 查询镜像详细信息
    

    2.3 删除镜像

    docker rmi  ID 
    docker rmi `docker images -q` 
    

    2.4 导入导出镜像

    docker image save nginx >/opt/nginx.tar.gz
    docker image load -i /opt/nginx.tar.gz
    docker [image] tag centos onlineyh:centos7.8 给centos 修改名字 tag
    

    3.docker容器 docker container

    3.1 docker 交互式启动

    --name 指定名字
    --rm  容器退出就自动销毁
    -it 交互式
    --privileged=true docker 应用容器 获取宿主机root权限(特殊权限-)
    docker run -it --name "test" centos /bin/bash
    docker run -it --name "test1" --rm  centos /bin/bash   加--rm后容器退出就自动删除销毁 
    docker container ls -a 查看
    docker ps -a  查看
    docker ps -a  -q 查看id
    docker container rm test1 
    交互式启动容器 Ctrl+p+q 可以hold住
    docker container attach NAME 调入到前台
    

    3.2 docker守护式启动

    docker run  -d -p 80:80 --name "testnginx" nginx
    docker run  --name testnginx1  -d nginx /bin/sh -c "while true ;do echo hello world; sleep 1;done" 死循环
    

    3.3 docker 端口

    指定映射(docker 会自动添加一条iptables规则来实现端口映射)
    随机端口是从32768开始顺序向后 
        -p hostPort:containerPort
        -p ip:hostPort:containerPort 
        -p ip::containerPort(随机端口)
        -p hostPort:containerPort/udp  udp端口
        -p 81:80 –p 443:443
    随机映射
        docker run -P 80(随机端口)
    docker port nginx 查看容器映射的端口信息
    

    3.4 docker 启动关闭

    docker  start/stop/restart/kill  test 启动关闭重启
    ctrl +d 退出
    docker  start -i  test 启动后直接进入容器中
    

    3.5 docker 进入容器

    docker container attach testnginx 打开所有窗口一样的界面
    docker container exec -it test /bin/bash 子进程的方式登录退出不影响当前容器
    

    3.6 docker 容器内进程查看 日志查看 开机启动

    docker ps -a  -q -l
    docker container -a -q 新命令跟上面一样
    docker ps --no-trunc -a 以详细信息查看内容 默认会自动隐藏内容
    docker top testxx  查看容器内的运行进程
    docker inspect
    docker attach 容器ID|容器名称(工具类)配合ctrl+p+q
    docker exec  -i -t  容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用
    docker exec -it  centos6.9   /bin/bash
    docker logs testxx
    docker logs -t testxx 根据时间查看日志 
    docker logs -tf testxx 查看实时动态的日志
    docker logs -tf  --tail 10 testxx 最后10行
    docker logs -tf  --tail 0 testxx
    docker run  -d -p 80:80 --restart=always  --name "testnginx" nginx 添加到开机启动
    docker update --restart=always testxx 添加开机启动 已运行的容器
    

    4. docker 数据卷

    4.1 docker container cp

    docker run -d --name nginx  -p 81:80 nginx
    docker container cp index.html nginx:/usr/share/nginx/html/ 拷贝文件到容器内 容器删除 就不存在
    

    4.2 docker container -v

    docker run -d --name="nginx1" -P -v /data:/usr/share/nginx/html nginx
    docker run -d --name="nginx2" -P -v /data:/usr/share/nginx/html nginx  两个容器同时挂载一个数据卷
    

    4.3 docker container 容器卷

    docker run -it  --name "httpd_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos /bin/bash
    如果宿主机文件不存在会自动创建
    ctrl +p +q 使其不退出
    touch /opt/Volume/{a,b}/test.txt
    docker run -d  -p 8085:80 --volumes-from  httpd_volumes --name "http8085"  nginx
    docker run -d  -p 8086:80 --volumes-from  httpd_volumes --name "http8086"  nginx
    docker container exec -it  http8086 /bin/bash 进入容器查看数据是否存在
    

    4.4 容器手动制作

    配置本地局域网yum源
    mount  /dev/cdrom /mnt  cdrom挂载
    mount -o loop CentOS-7-x86_64-DVD-2003.iso /mnt iso挂载
    yum install nginx
    vim /etc/nginx/conf.d/default.conf
    location / {
            root   /mnt;
            index  index.html index.htm;
            autoindex on;
            autoindex_localtime on;
            autoindex_exact_size off;
            charset utf-8,gbk;
            }
    systemctl start nginx
    cat  >>/etc/yum.repos.d/cdrom.repo  <<EOF
    [cdrom]
    name=cdrom
    baseurl=http://192.168.122.103
    enabled=1
    gpgcheck=0
    EOF
    

    4.4.1 例如:制作容器 具有ssh功能

    https://registry.hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated 
    docker pull centos:7.9.2009 默认centos是8
    mv /etc/yum.repo.d/*.repo /tmp
    cat  >>/etc/yum.repos.d/cdrom.repo  <<EOF
    [cdrom]
    name=cdrom
    baseurl=http://192.168.122.103
    enabled=1
    gpgcheck=0
    EOF
    docker run -it --name "centos_ssh" 8652b9f0cb4c 启动容器
    yum install openssh-server -y  安装sshd服务端 附带openssh依赖安装
    /usr/sbin/sshd -D &  ssh启动报错
    [1] 79
    [root@690bd21dfe47 /]# Could not load host key: /etc/ssh/ssh_host_rsa_key
    Could not load host key: /etc/ssh/ssh_host_ecdsa_key
    Could not load host key: /etc/ssh/ssh_host_ed25519_key
    sshd: no hostkeys available -- exiting.
    解决: ssh-keygen -A
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
    修改sshd运行在前端
    mkdir /var/run/sshd
    sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
    /usr/sbin/sshd -D & 启动
    yum install lsof -y 
    lsof -i :22 查看端口是否容器中运行
    echo "123456" | passwd root --stdin  添加密码
    宿主机运行:
    docker inspect  centos_ssh 查看容器ip地址
    ssh root@172.17.0.2 输入密码正常登陆
    
    镜像制作 :
    docker commit centos_ssh onlineyh/centos7.9_sshd:v1
    镜像运行 映射端口 
    docker run -d -p 2222:22 --name=sshd onlineyh/centos7.9_sshd:v1  /usr/sbin/sshd -D
    ssh 192.168.122.102 -p 2222 登陆正常
    

    4.4.2 例如:制作容器 具有lamp功能

    docker run -it --name "centos_lamp" -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html 8652b9f0cb4c  运行一个容器
    mv /etc/yum.repo.d/*.repo /tmp
    cat  >>/etc/yum.repos.d/cdrom.repo  <<EOF
    [cdrom]
    name=cdrom
    baseurl=http://192.168.122.103
    enabled=1
    gpgcheck=0
    EOF
    yum install  openssh-server httpd php php-mysql mariadb-server  net-tools -y
    mkdir /var/run/sshd
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
    sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
    echo "123456" | passwd root --stdin
    /usr/sbin/sshd -D &   启动ssh
    /usr/sbin/httpd -D FOREGROUND &  启动http
    mysql_install_db --user=mysql --datadir=/var/lib/mysql   启动mysql
    /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &
    vim /data/vol/html/info.php  测试界面
    <?php
        Phpinfo();
    ?>
    mysql -uroot -p
    grant all *.* to root@'%' identified by '123456';
    grant all *.* to root@'localhost' identified by '123456';
    create database discuz charset utf8;
    docker commit centos_lamp onlineyh/centos7.9_lamp:v1  手动构建镜像
    
    宿主机操作:
    docker run -d --name "centos_lamp1" -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html -p 80:80 -p 2222:22 -p 33060:3306 onlineyh/centos7.9_lamp:v1 /usr/sbin/sshd -D
    wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
    unzip Discuz_X3.2_SC_UTF8.zip 
    mv upload/* /data/vol/html/
    chmod -R go+w config data uc_client uc_server
    http://192.168.122.102 下一步 注意mysql服务器输入172.17.0.2 容器的ip 或者手动修改localhost的密码
    docker commit centos_lamp1 onlineyh/centos7.9_lamp:v2
    [root@gitlab html]# cat /data/vol/html/init.sh   写个脚本
    #!/bin/bash
    /usr/sbin/httpd -D FOREGROUND &
    /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &
    /usr/sbin/sshd -D 
    运行下面程序 这样就跑起来了
    docker run -d  -v /data/vol/mysql:/var/lib/mysql -v /data/vol/html:/var/www/html -p 80:80 -p 2222:22 -p 33060:3306 onlineyh/centos7.9_lamp:v3 /var/www/html/init.sh
    mysql -uroot -h192.168.122.102 -P33060 -p123456
    ssh 192.168.122.102 -p2222
    

    5. docker dockerfile

    5.1 docker 具有sshd功能

    [root@gitlab centos-sshd]# cat dockerfile 
    FROM centos:centos7.9.2009
    RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
    RUN yum makecache fast && yum install openssh-server -y && mkdir /var/run/sshd && sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config && ssh-keygen -A
    RUN echo "123456"|passwd root --stdin 
    EXPOSE 22
    CMD ["/usr/sbin/sshd","-D"]
    docker build -t "sshd:v1" .   构建
    docker run -d -P --name "ssh1" sshd:v1 使用登录测试
    

    5.2 docker使用systemctl命令启动sshd

    https://github.com/docker-library/docs/tree/master/centos#systemd-integration
    vim Dockerfile
    FROM centos:7
    ENV container docker
    RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
    systemd-tmpfiles-setup.service ] || rm -f $i; done); \
    rm -f /lib/systemd/system/multi-user.target.wants/*;\
    rm -f /etc/systemd/system/*.wants/*;\
    rm -f /lib/systemd/system/local-fs.target.wants/*; \
    rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
    rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
    rm -f /lib/systemd/system/basic.target.wants/*;\
    rm -f /lib/systemd/system/anaconda.target.wants/*;
    VOLUME [ "/sys/fs/cgroup" ]
    CMD ["/usr/sbin/init"]
    docker build -t "centos7.9:v1" .  基础镜像
    
    [root@gitlab ssh]# vim dockerfile 
    FROM centos7.9:v1
    RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
    RUN yum makecache fast && yum install openssh-server iproute net-tools -y && rm -rf /var/cache/yum/*
    RUN echo '123456' | passwd root --stdin
    RUN systemctl enable sshd
    EXPOSE 22
    CMD ["/usr/sbin/init"]
    docker build -t "centos_sshd:v2" .
    docker run -tid --privileged=true --name testssh -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 2022:22 centos_sshd:v2  注意必须加--privileged=true
    

    5.3 docker使用systemctl命令lamp

    FROM centos7.9:v1
    RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[cdrom]\nname=cdrom\nbaseurl=http://192.168.122.103\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/cdrom.repo
    RUN yum makecache fast && yum install openssh-server iproute net-tools httpd mariadb-server  php php-mysql -y && rm -rf /var/cache/yum/*
    RUN echo '123456' | passwd root --stdin
    RUN systemctl enable sshd mariadb httpd
    VOLUME [ "/var/www/html" ]
    EXPOSE 80
    EXPOSE 3306
    EXPOSE 22
    CMD ["/usr/sbin/init"]
    docker build -t "lamp:v1" .
    docker run -tid --privileged=true --name lamp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /data/html:/var/www/html -P lamp:v1 
    

    5.4 docker dokcerfile介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建
      通过使用build命令,根据Dockerfiel的描述来构建镜像
      通过源代码路径的方式
      通过标准输入流的方式
    Dockerfile指令:
      只支持Docker自己定义的一套指令,不支持自定义
      大小写不敏感,但是建议全部使用大写
      根据Dockerfile的内容顺序执行
    FROM:
      FROM {base镜像}
      必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
    MAINTAINER:
      可选的,用来标识image作者的地方
    
    RUN:
      每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base
      一个Dockerfile中可以包含多个RUN,按定义顺序执行
      RUN支持两种运行方式:
        RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行
        RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径
      RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
    例如 这条命令 mysql_install_db --user=mysql --datadir=/var/lib/mysql  修改成如下
    RUN ["mysql_install_db", "--user=mysql"," --datadir=/var/lib/mysql"] 
    
    CMD:
      CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
      当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
      一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用 
    CMD定义的三种方式:
      CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行
      CMD ["executable","arg1",....]
      CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数 
    
    EXPOSE 声明端口
      格式为 EXPOSE <端口1> [<端口2>...]。
      EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
    
    entrypoint:
      entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
      每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
      当定义了entrypoint以后,CMD只能够作为参数进行传递
    entrypoint定义方式:
      entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数
      entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令
    
    ADD & COPY:
      当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中
      ADD和COPY的源必须在context路径下
      当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以
    work
      ADD相对COPY还有一个多的功能,能够进行自动解压压缩包 只支持.tar.* 不支持zip
    
    ENV:
      ENV key value
      用来设置环境变量,后续的RUN可以使用它所创建的环境变量
      当创建基于该镜像的container的时候,会自动拥有设置的环境变量 
    
    WORKDIR:
      用来指定当前工作目录(或者称为当前目录)
      当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准 
    USER:
      指定UID或者username,来决定运行RUN指令的用户 
    ONBUILD:
      ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令
      可以定义多个ONBUILD指令
      当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令
      ONBUILD <DOCKERFILE 指令> <content>
    VOLUME:
      用来创建一个在image之外的mount point,用来在多个container之间实现数据共享
      运行使用json array的方式定义多个volume
      VOLUME ["/var/data1","/var/data2"]
      或者plain text的情况下定义多个VOLUME指令
    
    [root@hk tmp]# cat Dockerfile
    FROM debian:jessie
    RUN buildDeps='gcc libc6-dev make' \
             && apt-get update \
             && apt-get install -y $buildDeps \
             && wget  -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
             && mkdir -p /usr/src/redis \
             && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
             && make -C  /usr/src/redis \
             && make -C  /usr/src/redis install \
             && rm -rf /var/lib/apt/lists/* \
             && rm  redis.tar.gz \
             && rm -r /usr/src/redis \
             && apt-get purge -y --auto-remove $buildDeps 
    [root@hk tmp]# docker build -t redis:v3.2.5 .  开始构造 是&&不会分出多层
    [root@hk tmp]# docker history redis:v3.2.5 --no-trunc 长格式显示构造记录
    

    6. docker registry

    6.1 Harbor镜像仓库的搭建

    https://github.com/goharbor/harbor/releases
    https://docs.docker.com/compose/install/#prerequisites
    选择离线安装版harbor-offline-installer-v2.1.2.tgz (offline离线版 online在线版)
    wget https://github.com/goharbor/harbor/releases/download/v2.1.2/harbor-offline-installer-v2.1.2.tgz
     Harbor镜像 需要安装docker
                需要有docker-compose
    
    vim docker-compose.yml
    version: "3.0" ##定义版本号 
    services: ##服务
      tomcat: ##服务名称
        container_name: test ##容器名称
        image: tomcat:8 ##依赖镜像文件名称
        ports: ##映射端口
        - 8081:8080 ##外部 内部
        volumes: ##数据卷
        - /data/test:/etc/test ##外部 内部
            networks:
            - mytest
    networks: ##自定义桥
      mytest:
    
    [root@mon02 tomcat]# vim docker-compose.yml 
    version: "3.0"
    services:
      tomcat8080:
        image: tomcat:8
        ports:
        - 8080:8080
        volumes:
        - /usr/tomcat/webapps:/usr/local/tomcat/webapps
        networks:
        - mayikt_web
      tomcat8081:
        image: tomcat:8
        ports:
        - 8081:8080
        volumes:
        - /usr/tomcat/webapps:/usr/local/tomcat/webapps
        networks:
        - mayikt_web
    networks:
      mayikt_web:
    

    portainer可视化

    https://portainer.readthedocs.io/en/stable/deployment.html

    $ docker volume create portainer_data
    $ docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
    

    6.1.1 compose的安装

    sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    docker-compose version
    

    6.1.2 harbor 安装

    tar xf harbor-offline-installer-v2.1.2.tgz -C /usr/local/
    cd /usr/local/harbor/
    cp harbor.yml.tmpl harbor.yml
    vim harbor.yml
    hostname: 192.168.122.107 域名
    #https: 注释掉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: admin  密码
    ./install.sh
    http://192.168.122.107      admin admin
    

    6.1.3 推送镜像

    [root@gitlab ~]# cat /etc/docker/daemon.json 
    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"],"insecure-registries":["192.168.122.107"]
    }
    systemctl restart docker
    docker image tag nginx:latest 192.168.122.107/onlineyh/nginx:v1
    docker login 192.168.122.107
    admin
    admin
    docker push 192.168.122.107/onlineyh/v2ray:v1
    

    6.1.4 拉取镜像 harbor设置公开 不然需要登录

    [root@gitlab ~]# cat /etc/docker/daemon.json 
    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"],"insecure-registries":["192.168.122.107"]
    }
    docker pull 192.168.122.107/onlineyh/v2ray:v1
    

    6.1.5 harbor仓库重启关闭

    cd /usr/local/harbor/
    后台启动容器:docker-compose up -d
    查看容器:docker-compose ps
    停止并删除容器:docker-compose down
    停止启动容器:docker-compose stop; docker-compose start
    [root@mysql harbor]# grep "data_volume" harbor.yml
    data_volume: /data  有使用数据卷 在宿主机/data 目录 所以再次关闭启动都不会丢失文件
    docker login 192.168.122.107 登录成功保存文件如下
    [root@gitlab ~]# cat /root/.docker/config.json 
    {
        "auths": {
            "192.168.122.107": {
                "auth": "YWRtaW46YWRtaW4="
            }
        }
    
    

    6.2 docker registry 容器仓库

    6.2.1 registry 简单操作

    docker pull registry
    docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
    docker image tag nginx:latest 192.168.122.107:5000/onlineyh/nginx:v1
    docke push 192.168.122.107:5000/onlineyh/nginx:v1
    [root@gitlab ~]# curl 192.168.122.107:5000/v2/_catalog  看到信息
    {"repositories":["onlineyh/nginx","onlineyh/v2ray"]}
    

    6.2.2registry 密码认证 使用apache认证

    生成密码:
    yum install httpd-tools -y
    mkdir /opt/registry-auth/ -p
    htpasswd  -Bbn test 123 >> /opt/registry-auth/htpasswd  >>这样不会覆盖之前的
    htpasswd  -Bbn test1 123 >> /opt/registry-auth/htpasswd 
    [root@oldboy ~]# docker login 192.168.122.107:5000
    Username: test 
    Password: 
    docker image tag nginx:latest 192.168.122.107:5000/onlineyh/nginx:v2
    docke push 192.168.122.107:5000/onlineyh/nginx:v2
    
    docker 关机或者重启服务docker自动启动 
    方法一:docker run --restart=always
    
    方法二:"live-restore": true
    docker server配置文件/etc/docker/daemon.json参考
    {
    .....
    ......
    "live-restore": true
    }
    

    7. docker 网络

    7.1 docker 网络介绍

    [root@mysql ~]# docker network ls
    NETWORK ID     NAME            DRIVER    SCOPE
    e3508f839e38   bridge          bridge    local
    ba42d1b01b05   harbor_harbor   bridge    local
    f61454c39d00   host            host      local
    124d1328b097   none            null      local
    docker network rm harbor_harbor  删除网络模式
    Docker容器的网络模式
    bridge模式,让容器跟docker0网卡桥接。上网通过nat上网
    host模式,让容器和宿主机共享网络
    none,关闭容器网络
    brctl show 查看桥接情况
    docker run -d --network=host  nginx:latest 使用 --net=指定网络模式
    

    7.2 Docker跨主机访问-macvlan实现

    两台主机同时执行:
    网卡设为混杂模式
    yum intall -y net-tools 
    ifconfig eth0 -promisc  设置混杂模式
    ifconfig eth0 -promisc 取消混杂模式
    docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=eth0 mac1
        -d 指定 Docker 网络 driver
        --subnet 指定 macvlan 网络所在的网络
        --gateway 指定网关
        -o parent 指定用来分配 macvlan 网络的物理网卡
    docker run -itd --name c1 --ip=172.16.10.2 --network mac1 busybox
    docker run -itd --name c2 --ip=172.16.10.3 --network mac1 busybox
    docker run -itd --name c3 --ip=172.16.10.30 --net=mac1 busybox
    

    7.3 Docker 跨主机访问-overlay实现

    docker run -d -p 8500:8500 -h consul --name consul --alway=restart  progrium/consul -server -bootstrap
    [root@gitlab ~]# vim /lib/systemd/system/docker.service   修改下面2行 eth0是网卡 ip 网卡根据实际修改
    #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock   原来的
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store consul://192.168.122.102:8500 --cluster-advertise eth0:2376  
    ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
    ExecReload=/bin/kill -s HUP $MAINPID
    systemctl daemon-reload 
    systemctl restart docker
    创建网络接口
    docker network create -d overlay --subnet 172.12.0.0/24 --gateway 172.12.0.1  overlay1
    另一台主机修改
    [root@gitlab ~]# vim /lib/systemd/system/docker.service   修改下面2行 eth0是网卡 ip 网卡根据实际修改
    #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock   原来的
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store consul://192.168.122.102:8500 --cluster-advertise eth0:2376  
    ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
    ExecReload=/bin/kill -s HUP $MAINPID
    systemctl daemon-reload 
    systemctl restart docker
    docker network ls 查看 另一台主机创建的overlay1 是否已经过来
    [root@gitlab ~]# docker network ls
    NETWORK ID     NAME              DRIVER    SCOPE
    30f908468367   bridge            bridge    local
    75a25cb73af0   docker_gwbridge   bridge    local
    a5905ea56eeb   host              host      local
    fa3e9d1b89ab   mac1              macvlan   local
    fceace67fab7   none              null      local
    cb58c75922de   overlay1          overlay   global
    docker run -it --network overlay1 --name t1  busybox /bin/sh
    docker run -it --network overlay1 --name t2  busybox /bin/sh
    

    相关文章

      网友评论

          本文标题:docker基础

          本文链接:https://www.haomeiwen.com/subject/ydhziktx.html