• 大家都会的Docker


    安装

    Linux 安装Docker

    更新yum

    sudo yum update

    安装需要的软件包

    yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

    设置yum源

    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    安装最新版

    yum -y install docker-ce

    启动docker

    systemctl daemon-reload

    systemctl start docker

    systemctl stop docker

    systemctl restart docker

    systemctl status docker

    systemctl enable docker

    修改源

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-‘EOF’
    {
    “registry-mirrors”: [“https://ikpg1kma.mirror.aliyuncs.com”]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

    添加信任仓库地址

    ,"insecure-registries": ["127.0.0.1:4433"]
    
    • 1

    Ubuntu安装Docker

    sudo su
    sudo apt-get update
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    sudo apt-get update
    sudo apt-get install docker-ce
    sudo systemctl enable docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    常用命令

    镜像相关命令

    查看本地镜像docker images

    • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
    • –digests :显示镜像的摘要信息;
    • -f :显示满足条件的镜像;
    • –format :指定返回值的模板文件;
    • –no-trunc :显示完整的镜像信息;
    • **-q **:只显示镜像ID。

    docker images -q

    搜索镜像docker search

    docker search 镜像

    docker search mysql

    拉取镜像docker pull

    docker pull 镜像:版本

    docker search mysql:5.7

    删除镜像docker rmi

    docker rmi 镜像:版本

    docker rmi mysql:5.7

    没有打标签

    docker rmi `docker images -q | awk '/^/ { print $3 }'`
    
    • 1

    镜像名包含关键字

    docker rmi --force `docker images | grep none | awk '{print $3}'`    //其中none为关键字
    
    • 1

    容器相关命令

    查看本地容器docker ps

    • -a :显示所有的容器,包括未运行的。
    • -f :根据条件过滤显示的内容。
    • –format :指定返回值的模板文件。
    • -l :显示最近创建的容器。
    • -n :列出最近创建的n个容器。
    • –no-trunc :不截断输出。
    • -q :静默模式,只显示容器编号。
    • **-s **:显示总的文件大小。

    docker ps -a

    参数说明

    CONTAINER ID: 容器 ID。

    IMAGE: 使用的镜像。

    COMMAND: 启动容器时运行的命令。

    CREATED: 容器的创建时间。

    STATUS: 容器状态。

    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)

    运行容器docker run

    • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    • -d: 后台运行容器,并返回容器ID;
    • -i: 以交互模式运行容器,通常与 -t 同时使用;
    • -P: 随机端口映射,容器内部端口随机映射到主机的端口
    • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    • –name=“nginx-lb”: 为容器指定一个名称;
    • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    • –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    • -h “mars”: 指定容器的hostname;
    • -e username=“ritchie”: 设置环境变量;
    • –env-file=[]: 从指定文件读入环境变量;
    • –cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
    • **-m **:设置容器使用内存最大值;
    • –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    • –link=[]: 添加链接到另一个容器;
    • –expose=[]: 开放一个端口或一组端口;
    • –volume , -v: 绑定一个卷,如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉,如果不指定host上的volume,-v /foo,则等同于VOLUME /foo,都是将container中的/foo 覆盖docker自动创建一个匿名的volume
    • –privileged : container内的root拥有真正的root权限

    docker run -d -p 8090:80 --name=mynginx nginx:latest

    进入容器内部docker exec

    • -d :分离模式: 在后台运行
    • -i:即使没有附加也保持STDIN 打开
    • -t :分配一个伪终端

    docker exec -it 容器名称 /bin/bash

    查看容器信息docker inspect

    docker inspect 容器名称

    删除容器docker rm

    docker rm 容器名称

    查看容器中运行的进程信息docker top

    docker top asp

    docker top a76fc395f6ee

    获取容器的日志docker logs

    docker logs asp

    docker logs a76fc395f6ee

    端口映射ocker port

    docker port asp

    docker port a76fc395f6ee

    docker ps

    暂停容器服务docker pause

    docker pause db01

    恢复容器服务docker unpause

    docker unpause db01

    启动/停止/重启

    docker start asp

    docker stop asp

    docker restart asp

    检查容器里文件结构的更改

    docker diff mymysql

    部署程序

    MongoDB

    拉取最新镜像

    docker pull mongo

    启动mongodb

    docker run --name mongo -p 27017:27017 -v /data/mongo:/data/mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin -d mongo

    进入容器

    docker exec -it mongo bash

    进入mongodb

    mongo -u admin -p admin

    切换数据库

    use admin

    创建管理员账户

    db.createUser({user:“root”,pwd:“root”,roles:[{role:“root”,db:“admin”}]})

    Mysql

    拉取镜像

    docker pull mysql:5.7

    启动mysql

    docker run --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 --net=“host” -d mysql:5.7

    连接mysql

    docker exec -it mysql5.7 bash

    navicat 连接docker容器里面mysql服务失败解决

    ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘root’ ;

    redis

    搜索redis镜像

    docker search redis

    拉取redis镜像

    docker pull redis:5.0

    创建并启动容器

    docker run -d --name=redis5.0 -p 6379:6379 redis:5.0

    tomcat

    搜索tomcat镜像

    docker search tomcat

    拉取tomcat镜像

    docker pull tomcat:8.5

    创建并启动容器

    docker run -d -p 8080:8080 --name=tomcat8.5 tomcat:8.5

    在本地模拟一个项目(创建一个hello目录,然后向目录中输出一个文件index.html,内容为hello world)

    mkdir ./hello echo “hello world” > ./hello/index.html

    从宿主机复制文件到容器(docker cp 宿主机路径 容器名称:容器路径)

    docker cp ./hello tomcat8.5:/usr/local/tomcat/webapps/

    Nginx

    搜索nginx镜像

    docker search nginx

    拉取tomcat镜像

    docker pull nginx

    创建并启动容器

    docker run -d --name=nginx -p 80:80 nginx

    nacos

    docker pull nacos/nacos-server
    
    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
    
    • 1
    • 2
    • 3

    rabbitmq

    拉取镜像

    docker pull rabbitmq
    
    • 1

    镜像创建和启动容器

    docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9
    
    • 1
    1. -d 后台运行容器;
    2. –name 指定容器名;
    3. -p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
    4. -v 映射目录或文件;
    5. –hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
    6. -e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

    启动rabbitmq_management

    docker run -dit --restart=always --name myrabbitmq -e RABBITMQ_DEFAULT_USER=haolink -e RABBITMQ_DEFAULT_PASS=haolink -p 15672:15672 -p 5672:5672 rabbitmq:management
    
    • 1

    kafka

    https://github.com/wurstmeister/kafka-docker

    拉取镜像

    docker pull wurstmeister/kafka:2.12-2.3.1
    docker pull wurstmeister/zookeeper
    docker pull sheepkiller/kafka-manager
    
    • 1
    • 2
    • 3

    docker-compose.yml

    注意ip填写外网地址

    version: '2'
    services:
      zookeeper:
        image: wurstmeister/zookeeper:latest
        ports:
          - "2181:2181"
        restart: unless-stopped
      kafka:
        image: wurstmeister/kafka:2.12-2.3.1
        depends_on: [ zookeeper ]
        ports:
          - "9092:9092"
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 192.168.6.76
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        restart: unless-stopped
      kafka-manager:
        container_name: kafka-manager
        image: sheepkiller/kafka-manager
        depends_on: [ kafka ]
        ports:
          - "7000:9000"
        environment:
          ZK_HOSTS: 192.168.6.76:2181
      kafka-ui-lite:
        container_name: kafka-ui-lite
        image: freakchicken/kafka-ui-lite
        depends_on: [ kafka ]
        ports:
           - "8889:8889"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    启动

    docker-compose up -d
    
    • 1

    启动测试

    记住启动的启动名称,kafka为 kafka_kafka_1 ,zookeeper 为 kafka_zookeeper_1 .
    如果docker-compose正常启动,此时docker ps会看到以上两个容器。进入kafka容器

    docker exec -it kafka_kafka_1 bash
    
    • 1

    创建一个topic

    $KAFKA_HOME/bin/kafka-topics.sh --create --topic topic --partitions 4 --zookeeper kafka_zookeeper_1:2181 --replication-factor 1 
    
    • 1

    注意–zookeeper后面的参数为,容器的name
    查看刚刚创建的topic

    $KAFKA_HOME/bin/kafka-topics.sh --zookeeper kafka_zookeeper_1:2181 --describe --topic topic
    
    • 1

    发布信息

    bash-4.4# $KAFKA_HOME/bin/kafka-console-producer.sh --topic=topic --broker-list kafka_kafka_1:9092
    >ni
    >haha
    
    • 1
    • 2
    • 3

    同样注意–broker-list后面的参数
    接收消息

    bash-4.4# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka_kafka_1:9092 --from-beginning --topic topic
    ni
    haha
    
    • 1
    • 2
    • 3

    安装脚本

    #!/bin/bash
    # 脚本说明:安装kafka
    #        环境准备:docker
    #        注意事项:修改存放文件的目录、修改公网ip、sed处的ip
    IP=192.168.6.111
    echo "============================安装docker-compose============================================="
    cd /usr/local/bin && wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 && mv docker-compose-Linux-x86_64 docker-compose && chmod 777 docker-compose && docker-compose -version
    echo "============================下载镜像======================================================="
    docker pull wurstmeister/kafka:2.12-2.3.1
    docker pull wurstmeister/zookeeper
    docker pull freakchicken/kafka-ui-lite
    echo "=============$(pwd)/docker-compose.yml================================================="
    tee $(pwd)/docker-compose.yml <<-'EOF'
    version: '2'
    services:
      zookeeper:
        image: wurstmeister/zookeeper:latest
        ports:
          - "2181:2181"
        restart: unless-stopped
      kafka:
        image: wurstmeister/kafka:2.12-2.3.1
        depends_on: [ zookeeper ]
        ports:
          - "29092:9092"
        environment:
          KAFKA_ADVERTISED_HOST_NAME: IP
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        restart: unless-stopped
      kafka-ui-lite:
        container_name: kafka-ui-lite
        image: freakchicken/kafka-ui-lite
        depends_on: [ kafka ]
        ports:
           - "28889:8889"
    EOF
    echo "========================================sed================================================="
    sed -i "s/IP/192.168.6.111/g" $(pwd)/docker-compose.yml
    echo "=========================docker-compose up -d==============================================="
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    数据卷

    作用

    数据持久化

    容器之间的数据交换

    配置

    docker run --name mongo -p 27017:27017 -v /data/mongo:/data/mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin -d mongo

    docker run -d --name=tomcat1 -p 8081:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5
    docker run -d --name=tomcat2 -p 8082:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5

    Docker镜像制作

    使用容器制作镜像(重点)

    docker commit 容器id 镜像名称:版本号

    docker commit -m"test" -a"wzd" d4b129c7f9c8 registry.cn-hangzhou.aliyuncs.com/123:123

    使用Dockerfile制作镜像(重点)

    Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响。

    image-20201206131621542

    1. VOlUME 可实现挂载功能,可以将内地文件夹或者其他容器中的文件夹挂载到这个容器中

    案例:基于jdk1.8环境运行springboot项目,打包为镜像

    1. 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux

    image-20201217152323827

    2)创建一个springboot-dockerfile文件,内容如下

    # 定义基础镜像(从哪个镜像的基础上开始做)
    FROM java:8 
    # 将jar包添加到容器,并改名为app.jar
    ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
    # 镜像启动容器的时候,执行的命令
    CMD java -jar app.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 通过dockerfile构建镜像
    # -f :指定要使用的Dockerfile路径   -t :指定生成的镜像名称   .  镜像构建过程中的上下文环境的目录 	
    docker build -f ./springboot-dockerfile -t lofxve .
    
    • 1
    • 2
    1. 查看生成的镜像,并运行为容器
    docker run -d -p 18080:8080 lofxve:latest
    
    • 1

    5)访问测试

    image-20201217162709057

    Dockerfile 时区问题

    ENV LANG zh_CN.UTF-8
    ENV LANGUAGE zh_CN:en
    ENV LC_ALL zh_CN.UTF-8
    
    • 1
    • 2
    • 3

    安装Chrome浏览器和chromedriver驱动

    FROM ubuntu:18.04
    # Install Chrome for Selenium
    RUN curl https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /chrome.deb
    RUN dpkg -i /chrome.deb || apt-get install -yf
    RUN rm /chrome.deb
    # Install chromedriver for Selenium
    RUN curl https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip -o /usr/local/bin/chromedriver
    RUN chmod +x /usr/local/bin/chromedriver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    镜像导入导出(扩展)

    将镜像保存成tar包: docker save -o 导出文件名 镜像:版本

    docker save -o ./lofxve.tar lofxve:latest

    接下来删除我们本地的mynginx:hehe镜像

    docker rmi lofxve:latest

    然后再从tar包中将镜像导入到本机

    docker load < ./lofxve.tar

    docker load -i ./lofxve.tar

    镜像仓库

    jenkins

    #!/bin/bash -v
    echo "脚本开始执行"
    name=registry.cn-hangzhou.aliyuncs.com/test_wzd/crawler-platform
    tag=$(date -d today +"%Y%m%d")
    echo "构建镜像!"
    docker build -t $name:$tag -f Dockerfile . 
    echo "镜像成功生成"
    docker login --username= --password= registry.cn-shanghai.aliyuncs.com 
    echo "登录镜像仓库成功!"
    docker push $name:$tag
    docker tag $name:$tag $name:latest
    docker push $name:latest
    echo "镜像推送完成!"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    DockerCompose

    Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用

    Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。

    Compose安装

    安装docekr compose 工具

    curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose

    设置权限

    chmod +x /usr/local/bin/docker-compose

    查看版本

    docker-compose -version

    cd /usr/local/bin && wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 && mv docker-compose-Linux-x86_64 docker-compose && chmod 777 docker-compose && docker-compose -version

    Compose命令

    image-20201217171246083

    Compose案例

    通过docker compose进行容器批量管理:一次性启动三个容器(nginx,tomcat,redis)

    1) 创建docker-compose目录

    mkdir ~/docker-compose
    cd ~/docker-compose
    
    • 1
    • 2

    2) 创建docker-compose.yml文件,内容如下

    version: '3'
    services: 
      nginx:
       container_name: my_nginx
       image: nginx
       ports:
        - 80:80
      tomcat:
       container_name: my_tomcat
       image: tomcat:8.5
       ports:
        - 8080:8080    
      redis:
       container_name: my_redis
       image: redis:5.0
       ports:
        - 6379:6379        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3) 启动容器

    # 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器
    docker stop $(docker ps -q)
    docker rm $(docker ps -aq)
    
    # 执行命令,启动容器
    # 执行此命令的时候,需要和配置文件在同一个目录下
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 停止并删除容器
    # 执行此命令的时候,需要和配置文件在同一个目录下
    docker-compose down
    
    • 1
    • 2

    Docker和VM对比

    相同:

    • 容器和虚拟机具有相似的资源隔离和分配优势

    不同:

    • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
    • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
  • 相关阅读:
    【leetcode】【剑指offer】【二进制中1的个数】
    最详细的mysql安装教程+mysql文件下载链接
    spoken english
    Easyx图形库趣味编程note3,多彩的颜色(画一道彩虹)
    WuThreat身份安全云-TVD每日漏洞情报-2023-10-07
    Spring读取.xml和通过Java类配置对比
    fsync
    C#流程控制语句
    Linux基本使用
    Vue的生命周期函数有哪些?详细说明
  • 原文地址:https://blog.csdn.net/wei_zhen_dong/article/details/126394290