docker超强总结,docker这一篇就够了

一、docker 安装

0 、一些信息

默认情况下,物理机下创建的docker容器的空间是10G,内存是物理机内存

1、yum安装

# 1. 查看安装版本
docker version
# 2. 删除旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 3. 安装工具包
sudo yum install -y yum-utils
# 4. 添加docker源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 5. 搜索docker软件列表
sudo yum list docker-ce --showduplicates | sort -r
# 6. 安装最新docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 6. 安装指定版本docker
# sudo yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

# 7. 设置默认存储路径
sudo vim /etc/docker/daemon.json
    # 加上data-root参数
    { 
      "data-root": "/data/docker/var/lib/docker" 
    }
# 重载配置
sudo systemctl daemon-reload

2、开机启动

# 7. 启动
sudo systemctl start docker
# 8.设置开机启动
sudo systemctl enable docker
# 9.查看开机启动
sudo systemctl list-unit-files|grep docker

3、免sudo执行docker命令

# 10. 查看安装版本
docker version
# 11. 添加docker用户组
sudo groupadd docker          
# 12. 将当前用户添加至docker用户组
sudo gpasswd -a $USER docker  
# 13. 切换session到docker用户组
newgrp docker              

4、命令补齐, 镜像加速

# 14. 命令自动补全
sudo yum -y install bash-completion 
source /etc/profile.d/bash_completion.sh

# 15. 镜像加速
sudo vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看使用镜像,下方Registry Mirrors条目
docker info

5、其他: apt-get安装

# 卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
# 依赖
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88

# 设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"


# 3.安装 Docker Engine-Community
# 更新
sudo apt-get update

# 查看版本信息
sudo apt-cache show docker-ce
 
# 安装最新的Docker-ce
sudo apt-get install docker-ce

# 启动
sudo systemctl enable docker
sudo systemctl start docker

# 4.测试
sudo docker run hello-world

二、docker-compose安装

# 1. 下载二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 2. 设置可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 3. 查看版本
docker-compose -v

三、docker-compose

1、docker-compose 常用命令

官方文档: https://docs.docker.com/compose/reference/

# 启动容器并后台运行(根据文件)
docker-compose -f tsdp-portal.yml up -d
# 停止容器(根据文件)
docker-compose -f tsdp-portal.yml down
# 停止容器并删除系统卷
docker-compose -f tsdp-portal.yml down --volumes
#构建建启动tsdp-portal1容器
docker-compose up -d tsdp-portal1   
#登录到tsdp-portal1容器中
docker-compose exec tsdp-portal1 bash   
#删除所有tsdp-portal1容器,镜像
docker-compose down   
#显示所有容器
docker-compose ps  
#重新启动tsdp-portal1容器
docker-compose restart tsdp-portal1 
#在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose run --no-deps --rm php-fpm php -v  
#构建镜像 
docker-compose build tsdp-portal1  
#不带缓存的构建。
docker-compose build --no-cache tsdp-portal1   
#查看tsdp-portal1的日志 
docker-compose logs  tsdp-portal1   
#查看tsdp-portal1的实时日志
docker-compose logs -f tsdp-portal1 
#验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 
docker-compose config  -q   
#以json的形式输出tsdp-portal1的docker日志
docker-compose events --json tsdp-portal1 
#暂停tsdp-portal1容器
docker-compose pause tsdp-portal1  
#恢复ningx容器
docker-compose unpause tsdp-portal1 
#删除容器(删除前必须关闭容器)
docker-compose rm tsdp-portal1  
#停止tsdp-portal1容器
docker-compose stop tsdp-portal1  
#启动tsdp-portal1容器
docker-compose start tsdp-portal1  

2、运行jar包

2.1、启动

cd /home/weixin/workspace/docker/

vim tsdp-portal.yml

docker-compose -f tsdp-portal.yml up -d

2.2、停止

docker-compose -f tsdp-portal.yml down

2.3、日志

docker-compose -f tsdp-portal.yml logs -f

2.4、tsdp-portal.yml
# tsdp-portal.yml文件
version: '3'
services:
  tsdp-portal:
    image: docker.io/adoptopenjdk/openjdk11
    container_name: tsdp-portal
    environment:
      - spring.profiles.active=pro
      - server.port=8080
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080
    networks:
      - net-tsdp-portal
    volumes:
      - /home/weixin/workspace/tsdp-portal/:/app/tsdp-portal/
    entrypoint: ["sh","-c","cd /app/tsdp-portal/ && java -jar tsdp-portal.jar"]
    #command:
    #  - /bin/sh
    #  - -c
    #  - |
    #    cd /app/tsdp-portal/
    #    ... 任意命令
networks:
  net-tsdp-portal:
    driver: bridge

3、mysql yml示例

version : '3'
services:
  swapping:
    container_name: swapping-compose
    build:
      context: .
      dockerfile: Dockerfile-swapping
    ports:
      - "9666:9666"
    volumes:
      - .:/vol/development
    depends_on:
      - mysql
    links:
      - "mysql:mysql"
    restart: always
    networks:
      - my-network
    environment:
      - TZ=Asia/Shanghai

  mysql:
    container_name: mysql-compose
    image: mysql:5.7
    ports:
      - "33061:3306"
    command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci',
            '--default-time-zone=+8:00'
    ]
    environment:
      MYSQL_DATABASE: swapping
      MYSQL_ROOT_PASSWORD: 398023
      MYSQL_ROOT_HOST: '%'
    restart: always
    networks:
      - my-network
networks:
  my-network:

4、yml文件属性一览

version : '3'        #docker引擎对应所支持的docker-compose文本格式
services:            #本工程的服务配置列表

  swapping:            #spring boot的服务名,服务名自定义
    container_name: swapping-compose    
                    #本spring boot服务之后启动的容器实例的名字,如果指定,按照这个命名容器,如果未指定,容器命名规则是
                    #【[compose文件所在目录]_[服务名]_1】,例如【swappingdockercompose_swapping_1】
            #如果多启动,也就是docker-compose scale swapping=3 mysql=2的话,就不需要指定容器名称,否则会报错 容器名重复存在的问题
    build:            #基于Dockerfile文件构建镜像时使用的属性
      context: .    #代表当前目录,也可以指定绝对路径[/path/test/Dockerfile]或相对路径[../test/Dockerfile],尽量放在当前目录,便于管理
      dockerfile: Dockerfile-swapping    #指定Dockerfile文件名。如果context指定了文件名,这里就不用本属性了
    ports:                        #影射端口属性
      - "9666:9666"                #建议使用字符串格式,指定宿主机端口映射到本容器的端口
    volumes:                    #挂载属性
      - .:/vol/development        
                                  #挂载路径在compose配置文件中只能指定容器内的目录,而docker run命令可以指定[宿主机目录:容器内目录]的挂载方式。可以使用:ro对容器内目录设置只读,来保护宿主机的文件系统
    depends_on:                    #本服务启动,需要依赖哪些别的服务  例如这里;mysql服务就会先于swapping服务启动。至于配置多个的话,depends_on内的多个依赖的启动先后顺序未测试过
      - mysql
    links:                        #与depends_on相对应,上面控制启动顺序,这个控制容器连接问题。
      - "mysql:mysql"            #值可以是- mysql[- 服务名],也可以是- "mysql:mysql"[- "服务名:别名"]
    restart: always                #是否随docker服务启动重启
    networks:                    #加入指定网络
      - my-network                #自定义的网络名
    environment:                #environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果。设置容器的环境变量
      - TZ=Asia/Shanghai        #这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的 时区问题!!!!解决了容器的时区问题!!!

  mysql:                            #服务名叫mysql,自定义
    container_name: mysql-compose    #容器名
    image: mysql:5.7                #虽然没有使用build,但使用了image,指定基于mysql:5.7镜像为基础镜像来构建镜像。【使用build基于Dockerfile文件构建,Dockerfile文件中也有FROM基于基础镜像】
    ports:
      - "33061:3306"
    command: [                        #使用 command 可以覆盖容器启动后默认执行的命令
            '--character-set-server=utf8mb4',            #设置数据库表的数据集
            '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
            '--default-time-zone=+8:00'                    #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
    ]
    environment:            
      MYSQL_DATABASE: swapping                             #设置初始的数据库名
      MYSQL_ROOT_PASSWORD: 398023                        #设置root连接密码
      MYSQL_ROOT_HOST: '%' 
    restart: always
    networks:
      - my-network
networks:                        #关于compose中的networks的详细使用https://blog.csdn.net/Kiloveyousmile/article/details/79830810
  my-network:                    #自定义的网络,会在第一次构建时候创建自定义网络,默认是bridge

5、docker-compose格式对应docker版本

官网: https://docs.docker.com/compose/compose-file/

Compose file formatDocker Engine release
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
1.01.9.1.+

四、docker

1、运行tomcat

1.1、 拉取tomcat镜像
docker pull tomcat:7
1.2、 启动
docker run -d --privileged=true --restart=always -v /home/crluser/workspaces/dockercat/webapp:/usr/local/tomcat/webapps -v /home/crluser/workspaces/dockercat/data:/data -p 9002:8080 -p 2281:2280 --name cat2 tomcat:7 

说明:

/usr/local/tomcat/webapps为容器虚拟目录,里面内容为对应映射到主机目录的内容。

  • privileged:使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
  • -d:后台运行,可用docker stop/start [容器名][容器id] 停止、启动
  • -v:path1:path2,path1为主机目录,path2为映射到容器的目录。
  • -p:9002:8080, 9002为主机对外端口,8080为容器对外端口。意为将容器的8080端口映射到9002端口
  • –name:容器名称
  • tomcat:7:镜像名称
  • –restart:重启策略:always 一直重启
1.3、进入容器目录
docker exec -it cat bash
  • -i:打开容器的标准输入。
  • -t:告诉docker为容器建立一个命令行终端。
  • bash:告诉docker要在容器里面执行此命令。

2、打包docker为image

# 将容器打包成镜像
docker commit -a "runoob.com" -m "my apache" 容器名称或id 打包的镜像名称:标签
docker commit -a "baec" -m "tomcat8-asgardblockchain-explorer" e4812accd59f abc-explorer:0.1
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

3、Dockerfile

FROM tomcat:8
COPY asgardblockchain-explorer /usr/local/tomcat/webapps
docker build -t abc-explorer:latest .
docker run -d --privileged=true -v /opt/docker/asgardblockchain-explorer/logs2:/usr/local/tomcat/logs -p 8180:8080 --name abc-explorer abc-explorer:0.1

4、docker下运行centos

# 拉取镜像
docker pull centos
# 运行
docker run -itd --name centos_dianping_cat -p 9002:8080 -p 2281:2280 -v /home/crluser/workspaces/dockercentos/home:/home -v /home/crluser/workspaces/dockercentos/data:/data centos
docker run -itd --name centos_dianping_cat -p 9002:8080 -p 2281:2280 centos
# 进入docker容器的控制台
docker exec -it centos_dianping_cat bash

5、在服务器的docker中创建私有仓库

# 1、master主机的docker先从公有仓库下载registry 镜像
docker pull registry
# 2、master主机的docker启动镜像;添加挂载使得本地/root/docker/my_registry用来存放私有仓库的镜像,这样容器重启镜像也不会删除。
docker run -d -p 5000:5000 --restart=always --privileged --name registry-container -v /root/docker/my_registry:/var/lib/registry registry
# 3、master主机上修改每个结点的docker配置文件,用来将docker绑定到私有仓库;如果不配置会出现https错误
vi /lib/systemd/system/docker.service
    # 添加或修改
    ExecStart=/usr/bin/dockerd -H fd://  --insecure-registry=192.168.1.168:5000
# 4、重启docker
systemctl daemon-reload
systemctl restart docker

6、docker命令

常用选项说明
    -d, --detach=false, 指定容器运行于前台还是后台,默认为false
    -i, --interactive=false, 打开STDIN,用于控制台交互
    -t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
    -u, --user="", 指定容器的用户
    -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
    -w, --workdir="", 指定容器的工作目录
    -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
    -e, --env=[], 指定环境变量,容器中可以使用该环境变量
    -m, --memory="", 指定容器的内存上限
    -P, --publish-all=false, 指定容器暴露的端口
    -p, --publish=[], 指定容器暴露的端口
    -h, --hostname="", 指定容器的主机名
    -v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
    --volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
    --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
    --device=[], 添加主机设备给容器,相当于设备直通
    --dns=[], 指定容器的dns服务器
    --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
    --entrypoint="", 覆盖image的入口点
    --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
    --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
    --link=[], 指定容器间的关联,使用其他容器的IP、env等信息
    --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
    --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
    --net="bridge", 容器网络设置:
        bridge 使用docker daemon指定的网桥
        host //容器使用主机的网络
        container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
        none 容器使用自己的网络(类似--net=bridge),但是不进行配置
    --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
    --restart="no", 指定容器停止后的重启策略:
        no:容器退出时不重启
        on-failure:容器故障退出(返回值非零)时重启
        always:容器退出时总是重启
    --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

6.1、常用命令
删除镜像名称包含hello的镜像ID
sudo docker rmi $(sudo docker images | grep "dev-" | awk '{print $3}')
查找镜像名称包含hello的镜像ID
sudo docker images | grep "hello" | awk '{print $3}'
Centos7安装Docker
yum install docker
设置为开机启动
service docker start
chkconfig docker on
查看docker版本
docker version
拉取镜像
docker pull library/hello-world
查看镜像, Docker镜像保存在/var/lib/docker目录下
docker images
运行镜像
docker run hello-world
删除镜像
docker rmi hello-world
删除容器
docker rm container_name/container_id
删除所有停止的容器
docker rm $(docker ps -a -q)
查看正运行容器
docker ps
查看所有容器(已停止、创建、运行)
docker ps -a
启动、停止、重启容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
镜像重命名
docker tag IMAGEID  REPOSITORY:TAG
容器重命名
docker rename  old_name new_name
进入容器,后台启动一个容器后,如果想进入容器,可以使用attach命令:
docker attach container_name/container_id
# 或者
docker exec -it container_name /bin/bash
查看当前系统Docker信息
docker info
查看容器信息
docker inspect dockerName
查找镜像,查找Docker Hub上名称含nginx的镜像
docker search nginx
保存镜像为压缩包文件
docker save -o ubuntu_14.04.tar ubuntu:14.04
加载镜像文件
docker load -i ubuntu_14.04.tar

说明:
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
只有在容器删除时,镜像才可以删除。

7、启动镜像

# help
# -d 后台
# -p 端口映射, localPort:dockerPort
# -m 或 –-memory:设置内存的使用限额,例如 100M, 2G
# -v 卷映射, localDir:dockerDir
# --name, docker名称
# --restart, 停止后策略
# 最后 javaapp:v1.0 , 镜像名称和版本
docker run -d -p 12310:12301 --name="cm-single-0.7.1" -m 1G -v /opt/chainmaker/chainmaker-single-0.7.1/config:/config chainmaker-single:0.71 bash -c "chainmaker -e wx-org1 -t single-0.7.1 start"

docker run -d --name="cm-single-0.7.1-test" --restart=always -v /opt/chainmaker/chainmaker-single-0.7.1/chainmaker-go/config:/usr/config chainmaker-single:0.71 bash -c "while true; do echo hello world; sleep 1;done"

8、日志

# 常用
docker logs -f --tail=100 CONTAINER_ID\NAME
docker logs --since 1579139760000 owg-server

# 详情
docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值