学习Docker日常操作

本篇仅作为个人学习Docker的学习笔记,是从0到0.5的学习指南

Docker简述

Docker官网
Docker中文网
Docker Hub官网
阿里云镜像服务
Docker是基于GO语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

Docker安装

centos7安装

  1. yum安装gcc相关:
    yum -y install gcc
    yum -y install gcc-c++
  2. 卸载旧版本:
    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  3. 安装需要的软件包:
    yum install -y yum-utils device-mapper-persistent-data lvm2
  4. 设置stable镜像仓库:
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. 更新yum软件包索引:
    yum makecache fast
  6. 安装DOCKER CE:
    yum -y install docker-ce
  7. 启动docker:
    systemctl start docker
  8. 测试安装是否成功:
    docker version
  9. 卸载:
    systemctl stop docker
    yum -y remove docker-ce
    rm -rf /var/lib/docker
  10. 配置镜像加速【墙外可忽略】
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-‘EOF’
    {
    “registry-mirrors”: [“https://{自已阿里云的编码}.mirror.aliyuncs.com”]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker

centos8安装

  1. yum安装gcc相关:
    yum -y install gcc
    yum -y install gcc-c++
    
  2. 卸载旧版本:
     yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    
  3. 安装需要的软件包:
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  4. 设置stable镜像仓库:
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  5. 更新yum软件包索引: //centos8更新yum索引如果还带fast参数会报错误 yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)
      yum makecache
    
  6. 安装DOCKER CE:
     yum -y install docker-ce
    
  7. 如果在执行第6步安装时出现如下错误,则需要containerd.io的版本 >= 1.2.2-3:
    Problem: package docker-ce-3:18.09.9-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
    1. 安装wget指令
      yum install wget
      
    2. 获取指定版本的rpm包
      wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
      
    3. 升级containerd.io(安装rpm包)
      yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
      
    4. 重新安装docker-ce
        yum -y install docker-ce
      
  8. 启动docker并设置开机自启
    systemctl start docker
    systemctl enable docker
    
  9. 验证是否安装启动成功
     docker ps
    
    如果执行命令时提示:Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39
    则安装失败,需要卸载重新安装指定版本的docker-ce,重新安装时,安装docker-ce需修改如下:
    yum -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm
    yum install -y docker-ce-3:18.09.9-3.el7.x86_64 docker-ce-cli-1:18.09.9-3.el7.x86_64
    
  10. 其余加速相关的参考centos7即可

官网脚本安装

执行下述命令:

curl -fsSL get.docker.com | sh

Docker常用命令

基础命令

  1. docker version //查看版本信息:

  2. docker info //显示 Docker 系统信息,包括镜像和容器数

  3. docker --help //Docker帮助文档

  4. journalctl -u docker.service //查看docker运行日志

  5. docker system df //查询docker镜像&容器&数据卷&缓存占用系统空间
    docker system df命令详解
    TYPE 列出了docker 使用磁盘的 4 种类型:

    1. Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
    2. Containers:运行的容器占用的空间,表示每个容器的读写层的空间。
    3. Local Volumes:容器挂载本地数据卷的空间。
    4. Build Cache:镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。
      最后的 RECLAIMABLE 是可回收大小
  6. docker container prune //删除已停止的容器

  7. docker image ls -f dangling=true //列出所有悬挂状态的镜像

  8. docker image prune 或者 docker image rm $(docker image ls -f dangling=true -q) //删除悬挂状态的镜像

  9. docker volume prune 或者 docker volume rm $(docker volume ls -q) //删除悬挂状态的数据卷

  10. docker system prune //清除没用的空间(镜像/容器/数据卷/build cache)

常用镜像命令

  1. docker images [OPTIONS] [REPOSITORY[:TAG]] //列出本地主机上的镜像
    常用OPTIONS说明:
    -a :列出本地所有的镜像(含中间映像层)
    -q :只显示镜像ID
    –digests :显示镜像的摘要信息
    –no-trunc :显示完整的镜像信息
  2. docker search [OPTIONS] 镜像名字 //从Docker Hub查找镜像
    常用OPTIONS说明:
    -s : 列出收藏数不小于指定值的镜像
    –no-trunc : 显示完整的镜像描述
    –automated : 只列出 automated build类型的镜像
    eg:
    docker search -s 30 tomcat //tomcat收藏数大于30星的镜像
  3. docker pull 镜像名字[:TAG] //下载某个TAG版本的镜像到本地
  4. docker rmi [OPTIONS] IMAGE [IMAGE…] //删除本地一个或多个镜像
    常用OPTIONS说明:
    -f :强制删除
    –no-prune :不移除该镜像的过程镜像,默认移除
    eg:
    docker rmi -f 镜像ID //删除单个镜像
    docker rmi -f 镜像名1:TAG 镜像名2:TAG //删除多个镜像
    docker rmi -f $(docker images -qa) //删除全部镜像
  5. docker save [options] images [images…] //保存镜像为…将镜像转存
    eg:
    docker save -o nginx.tar nginx:latest //将nginx:latest镜像保存为nginx.tar(-o可替换为>)
  6. docker load [options] //从文件导入镜像,会成功导入镜像及相关元数据,包括tag信息
    eg:
    docker load -i nginx.tar //将nginx包导入为镜像(-i可替换为<)
  7. docker image prune //删除系统中的虚悬镜像

常用容器命令

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG…] //新建并启动容器
    OPTIONS说明:
    –name=“容器新名字”: 为容器指定一个名称
    -d: 后台运行容器,并返回容器ID,也即启动守护式容器
    -i:以交互模式运行容器,通常与 -t 同时使用
    -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
    -P: 随机端口映射
    -p: 指定端口映射,有以下四种格式:
    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort
    containerPort
    eg:
    docker run -it centos //使用镜像centos以交互模式启动一个容器
    这种docker run启动的容器可能没有systemctl等系统命令,需要容器中使用systemctl命令可以加一下参数:
    docker run -v /tmp/:/tmp --privileged --cap-add SYS_ADMIN -e container=docker -it --name=centos -d --restart=always centos /usr/sbin/init
    -v /tmp/:/tmp:挂载宿主机的一个目录,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录;
    –privileged: 指定容器是否是特权容器;
    –cap-add SYS_ADMIN: 添加系统的权限,不然系统很多功能都用不了的;
    -e container=docker:设置容器的类型
    /usr/sbin/init:初始容器里的CENTOS,用于启动dbus-daemon
  2. docker ps [OPTIONS] //列出当前所有正在运行的容器
    常用OPTIONS说明:
    -a :列出当前所有正在运行的容器+历史上运行过的
    -q :静默模式,只显示容器编号
    -l :显示最近创建的容器
    -n:显示最近n个创建的容器
    –no-trunc :不截断输出,显示完整的容器信息
  3. 退出容器两种方法:
    1. exit //容器停止并退出
    2. ctrl+P+Q //容器不停止退出
  4. docker start 容器ID或者容器名 //启动容器
  5. docker restart 容器ID或者容器名 //重启容器
  6. docker stop 容器ID或者容器名 //停止容器
  7. docker kill 容器ID或者容器名 //强制停止容器
  8. docker rm 容器ID //删除已停止的容器
  9. docker rm -f $(docker ps -aq) //一次性删除多个容器
  10. docker logs [OPTIONS] 容器ID //查看容器日志
    常用OPTIONS说明:
    –tail 数字 : 显示最后多少条
    -f : 跟随最新的日志打印
    -t : 是加入时间戳
  11. docker top 容器ID //查看容器内运行的进程
  12. docker inspect 容器ID //查看容器内部细节
  13. 退出后重新进入容器内部的两种方法:
    1. docker exec [OPTIONS] bashShell
      常用OPTIONS说明:
      -d :分离模式: 在后台运行
      -i :即使没有附加也保持STDIN 打开
      -t :分配一个伪终端
      eg:
      docker exec -t 5e68e9b16b31 ls -l //重新进入容器并把ls -l结果打印
    2. docker attach 容器ID
      两种进入区别:
      exec:是在容器中打开新的终端,并且可以启动新的进程
      attach:直接进入容器启动命令的终端,不会启动新的进程
  14. docker cp 容器ID:容器内路径 目的主机路径 //从容器内拷贝文件到主机上
    docker cp 当前主机路径 容器ID:容器内路径 //从主机拷贝文件到容器
  15. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] //提交容器副本使之成为一个新的镜像
    常用OPTIONS说明:
    -a :提交的镜像作者
    -c :使用Dockerfile指令来创建镜像
    -m :提交时的说明文字
    -p :在commit时,将容器暂停
    eg:
    docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
  16. docker export [options] container //从容器导出当前容器的快照(常用于压缩容器镜像)
    eg:
    docker export -o nginx.tar nginx //把运行的nginx容器导出为nginx包
  17. docker import [options] file|URL|- [REPOSITORY[:TAG]] //将一个包导入为镜像
    eg:
    docker import nginx.tar nginx:v01 //将包导入为一个nginx:v01的镜像
  18. docker network connect my_bridge web //将名为web的容器加入到my_bridge的网络中

Docker镜像

镜像简介

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

Docker加载镜像原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了,这也是为什么Docker版centos小的原因

Docker容器数据卷

卷的作用

  1. 容器数据的持久化
  2. 容器间继承+共享数据

数据卷的使用

  1. 第一种方式可以通过命令参数 -v 可以有多个
    docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 //带有权限,容器内的只读权限
  2. 第二种方式通过DockerFile添加
    可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
    格式:
    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
    构建镜像跑成容器之后可通过命令docker inspect 容器ID 查看容器内详情查看共享卷在宿主机默认位置

容器卷容器

概念

数据卷容器:命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器。容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

实现

主要命令:容器间传递共享(–volumes-from)
eg:
先启动带容器卷的父容器docker01,再启动后续容器
docker run -it --name docker02 --volumes-from docker01 centos

Dockerfile

概念

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
使用三步走:
编写Dockerfile文件
docker build
docker run

Dockerfile如何构建

基本认知:

  1. #表示注释
  2. 指令按照从上到下,顺序执行
  3. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  5. Base镜像(scratch):大部分镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的

构建流程:
构建Dockerfile命令eg:
docker build -f /mydocker/Dockerfile2 -t wyx/mycentos . //使用/mydocker路径下的Dockerfile2在当前路径下构建一个名为wyx/mycentos的镜像

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

Dockerfile主要保留字指令

  1. FROM //基础镜像,当前新镜像是基于哪个镜像的
  2. MAINTAINER //镜像维护者的姓名和邮箱地址
  3. RUN //容器构建时需要运行的命令
  4. EXPOSE //当前容器对外暴露出的端口
  5. WORKDIR //指定在创建容器后,终端默认登陆的进来工作目录
  6. ENV //用来在构建镜像过程中设置环境变量
  7. ADD //将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  8. COPY //类似ADD,但是只限于拷贝文件和目录到镜像中。
    两种使用形式:
    COPY src dest
    COPY [“src”, “dest”]
  9. VOLUME //容器数据卷,用于数据保存和持久化工作
  10. CMD //指定一个容器启动时要运行的命令
    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  11. ENTRYPOINT //指定一个容器启动时要运行的命令
    ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数,但是ENTRYPOINT不会被docker run之后的参数替换,而是参数追加
  12. ONBUILD //当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

Docker push

镜像生成方法

  1. 基于Dockerfile直接build生成镜像
  2. 从一个容器创建一个新镜像
    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
    常用OPTIONS说明:
    -a :提交的镜像作者;
    -m :提交时的说明文字;

镜像推送阿里云

  1. 登陆阿里云开发者平台创建命名空间及镜像仓库
  2. 进入刚创建的镜像仓库的管理,按平台提示执行相关命令即可。

例如: 推送当前服务器上的 hello-world:v01 镜像到 registry.cn-shanghai.aliyuncs.com

  1. 确定推送到这个地址的哪一个指定的命名空间,例如,推送到 admin 命名空间下,如果命名空间开启了自动创建仓库则可以直接推送,若没开启还需要控制台创建具体的镜像仓库 hello-world
    例:registry.cn-shanghai.aliyuncs.com/[命名空间]/[镜像仓库]:[镜像版本号]

  2. 执行 docker login --username=番茄炒蛋不要蛋 registry.cn-shanghai.aliyuncs.com 登录,执行成功会生成一个 ~/.docker/config.json 文件,如果知道此文件内容,可以直接从其他机器拷贝过来使用。文件内容如下, auth 对应的则是用户名和密码的base64:

    {
    	"auths": {
    		"registry.cn-shanghai.aliyuncs.com": {
    			"auth": "xxxxxxxxxxxxxxxxxxxxxx"
    		}
    	}
    }
    
  3. 执行 docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/admin/hello-world:v01 将要推送的镜像打个 tag

  4. 执行 docker push registry.cn-shanghai.aliyuncs.com/admin/hello-world:v01 推送到阿里云仓库

Docker方式安装相关软件

因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!
因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!
因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!

安装mysql

  1. 安装mysql:5.7,直接docker run 他会自动去官方镜像下载
    docker run -p 3306:3306 --name mysql
    -v /mydocker/mysql/conf:/etc/mysql/conf.d
    -v /mydocker/mysql/logs:/logs
    -v /mydocker/mysql/data:/var/lib/mysql
    -e MYSQL_ROOT_PASSWORD=123456
    -d mysql:5.7

    命令说明:
    -p 3306:3306:将主机的3306端口映射到docker容器的3306端口
    –name mysql:运行服务名字
    -v /mydocker/mysql/conf:/etc/mysql/conf.d :将主机/mydocker/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
    -v /mydocker/mysql/logs:/logs:将主机/mydocker/mysql目录下的 logs 目录挂载到容器的 /logs
    -v /mydocker/mysql/data:/var/lib/mysql :将主机/mydocker/mysql目录下的data目录挂载到容器的 /var/lib/mysql
    -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码
    -d mysql:5.7 : 后台程序运行mysql5.7
    docker安装的mysql默认允许远程连接,可以使用Navicat等软件连接数据库

  2. 进入容器mysql
    docker exec -it mysql bash

  3. 进入数据库 p后面跟你的密码
    mysql -uroot -pXXX

查看docker run启动参数命令

  1. 安装runlike即可
    pip install runlike
  2. 查看docker run 启动参数
    runlike -p <容器名>|<容器ID>

其他

Docker容器中文支持及时区设置问题
Docker存储目录迁移
web容器连接mysql容器简洁方式
nginx容器往多web容器转发请求


未完待续。。。。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值