本篇仅作为个人学习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安装
- yum安装gcc相关:
yum -y install gcc
yum -y install gcc-c++ - 卸载旧版本:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine - 安装需要的软件包:
yum install -y yum-utils device-mapper-persistent-data lvm2 - 设置stable镜像仓库:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 更新yum软件包索引:
yum makecache fast - 安装DOCKER CE:
yum -y install docker-ce - 启动docker:
systemctl start docker - 测试安装是否成功:
docker version - 卸载:
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker - 配置镜像加速【墙外可忽略】
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://{自已阿里云的编码}.mirror.aliyuncs.com”]
}
EOF
systemctl daemon-reload
systemctl restart docker
centos8安装
- yum安装gcc相关:
yum -y install gcc yum -y install gcc-c++
- 卸载旧版本:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
- 安装需要的软件包:
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置stable镜像仓库:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引: //centos8更新yum索引如果还带fast参数会报错误 yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)
yum makecache
- 安装DOCKER CE:
yum -y install docker-ce
- 如果在执行第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- 安装wget指令
yum install wget
- 获取指定版本的rpm包
wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
- 升级containerd.io(安装rpm包)
yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
- 重新安装docker-ce
yum -y install docker-ce
- 安装wget指令
- 启动docker并设置开机自启
systemctl start docker systemctl enable docker
- 验证是否安装启动成功
如果执行命令时提示:Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39docker ps
则安装失败,需要卸载重新安装指定版本的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
- 其余加速相关的参考centos7即可
官网脚本安装
执行下述命令:
curl -fsSL get.docker.com | sh
Docker常用命令
基础命令
-
docker version //查看版本信息:
-
docker info //显示 Docker 系统信息,包括镜像和容器数
-
docker --help //Docker帮助文档
-
journalctl -u docker.service //查看docker运行日志
-
docker system df //查询docker镜像&容器&数据卷&缓存占用系统空间
TYPE 列出了docker 使用磁盘的 4 种类型:- Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
- Containers:运行的容器占用的空间,表示每个容器的读写层的空间。
- Local Volumes:容器挂载本地数据卷的空间。
- Build Cache:镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。
最后的 RECLAIMABLE 是可回收大小
-
docker container prune //删除已停止的容器
-
docker image ls -f dangling=true //列出所有悬挂状态的镜像
-
docker image prune 或者 docker image rm $(docker image ls -f dangling=true -q) //删除悬挂状态的镜像
-
docker volume prune 或者 docker volume rm $(docker volume ls -q) //删除悬挂状态的数据卷
-
docker system prune //清除没用的空间(镜像/容器/数据卷/build cache)
常用镜像命令
- docker images [OPTIONS] [REPOSITORY[:TAG]] //列出本地主机上的镜像
常用OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID
–digests :显示镜像的摘要信息
–no-trunc :显示完整的镜像信息 - docker search [OPTIONS] 镜像名字 //从Docker Hub查找镜像
常用OPTIONS说明:
-s : 列出收藏数不小于指定值的镜像
–no-trunc : 显示完整的镜像描述
–automated : 只列出 automated build类型的镜像
eg:
docker search -s 30 tomcat //tomcat收藏数大于30星的镜像 - docker pull 镜像名字[:TAG] //下载某个TAG版本的镜像到本地
- 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) //删除全部镜像 - docker save [options] images [images…] //保存镜像为…将镜像转存
eg:
docker save -o nginx.tar nginx:latest //将nginx:latest镜像保存为nginx.tar(-o可替换为>) - docker load [options] //从文件导入镜像,会成功导入镜像及相关元数据,包括tag信息
eg:
docker load -i nginx.tar //将nginx包导入为镜像(-i可替换为<) - docker image prune //删除系统中的虚悬镜像
常用容器命令
- 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 - docker ps [OPTIONS] //列出当前所有正在运行的容器
常用OPTIONS说明:
-a :列出当前所有正在运行的容器+历史上运行过的
-q :静默模式,只显示容器编号
-l :显示最近创建的容器
-n:显示最近n个创建的容器
–no-trunc :不截断输出,显示完整的容器信息 - 退出容器两种方法:
- exit //容器停止并退出
- ctrl+P+Q //容器不停止退出
- docker start 容器ID或者容器名 //启动容器
- docker restart 容器ID或者容器名 //重启容器
- docker stop 容器ID或者容器名 //停止容器
- docker kill 容器ID或者容器名 //强制停止容器
- docker rm 容器ID //删除已停止的容器
- docker rm -f $(docker ps -aq) //一次性删除多个容器
- docker logs [OPTIONS] 容器ID //查看容器日志
常用OPTIONS说明:
–tail 数字 : 显示最后多少条
-f : 跟随最新的日志打印
-t : 是加入时间戳 - docker top 容器ID //查看容器内运行的进程
- docker inspect 容器ID //查看容器内部细节
- 退出后重新进入容器内部的两种方法:
- docker exec [OPTIONS] bashShell
常用OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
eg:
docker exec -t 5e68e9b16b31 ls -l //重新进入容器并把ls -l结果打印 - docker attach 容器ID
两种进入区别:
exec:是在容器中打开新的终端,并且可以启动新的进程
attach:直接进入容器启动命令的终端,不会启动新的进程
- docker exec [OPTIONS] bashShell
- docker cp 容器ID:容器内路径 目的主机路径 //从容器内拷贝文件到主机上
docker cp 当前主机路径 容器ID:容器内路径 //从主机拷贝文件到容器 - docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] //提交容器副本使之成为一个新的镜像
常用OPTIONS说明:
-a :提交的镜像作者
-c :使用Dockerfile指令来创建镜像
-m :提交时的说明文字
-p :在commit时,将容器暂停
eg:
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名] - docker export [options] container //从容器导出当前容器的快照(常用于压缩容器镜像)
eg:
docker export -o nginx.tar nginx //把运行的nginx容器导出为nginx包 - docker import [options] file|URL|- [REPOSITORY[:TAG]] //将一个包导入为镜像
eg:
docker import nginx.tar nginx:v01 //将包导入为一个nginx:v01的镜像 - 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容器数据卷
卷的作用
- 容器数据的持久化
- 容器间继承+共享数据
数据卷的使用
- 第一种方式可以通过命令参数 -v 可以有多个
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 //带有权限,容器内的只读权限 - 第二种方式通过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如何构建
基本认知:
- #表示注释
- 指令按照从上到下,顺序执行
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
- Base镜像(scratch):大部分镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的
构建流程:
构建Dockerfile命令eg:
docker build -f /mydocker/Dockerfile2 -t wyx/mycentos . //使用/mydocker路径下的Dockerfile2在当前路径下构建一个名为wyx/mycentos的镜像
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
Dockerfile主要保留字指令
- FROM //基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER //镜像维护者的姓名和邮箱地址
- RUN //容器构建时需要运行的命令
- EXPOSE //当前容器对外暴露出的端口
- WORKDIR //指定在创建容器后,终端默认登陆的进来工作目录
- ENV //用来在构建镜像过程中设置环境变量
- ADD //将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY //类似ADD,但是只限于拷贝文件和目录到镜像中。
两种使用形式:
COPY src dest
COPY [“src”, “dest”] - VOLUME //容器数据卷,用于数据保存和持久化工作
- CMD //指定一个容器启动时要运行的命令
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 - ENTRYPOINT //指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数,但是ENTRYPOINT不会被docker run之后的参数替换,而是参数追加 - ONBUILD //当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
Docker push
镜像生成方法
- 基于Dockerfile直接build生成镜像
- 从一个容器创建一个新镜像
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
常用OPTIONS说明:
-a :提交的镜像作者;
-m :提交时的说明文字;
镜像推送阿里云
- 登陆阿里云开发者平台创建命名空间及镜像仓库
- 进入刚创建的镜像仓库的管理,按平台提示执行相关命令即可。
例如: 推送当前服务器上的 hello-world:v01 镜像到 registry.cn-shanghai.aliyuncs.com
-
确定推送到这个地址的哪一个指定的命名空间,例如,推送到 admin 命名空间下,如果命名空间开启了自动创建仓库则可以直接推送,若没开启还需要控制台创建具体的镜像仓库 hello-world
例:registry.cn-shanghai.aliyuncs.com/[命名空间]/[镜像仓库]:[镜像版本号] -
执行 docker login --username=番茄炒蛋不要蛋 registry.cn-shanghai.aliyuncs.com 登录,执行成功会生成一个 ~/.docker/config.json 文件,如果知道此文件内容,可以直接从其他机器拷贝过来使用。文件内容如下, auth 对应的则是用户名和密码的base64:
{ "auths": { "registry.cn-shanghai.aliyuncs.com": { "auth": "xxxxxxxxxxxxxxxxxxxxxx" } } }
-
执行 docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/admin/hello-world:v01 将要推送的镜像打个 tag
-
执行 docker push registry.cn-shanghai.aliyuncs.com/admin/hello-world:v01 推送到阿里云仓库
Docker方式安装相关软件
因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!
因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!
因为容器删除数据就没了,所以为了将来修改配置或者持久化方便,安装任何软件一定要搞好数据卷!
安装mysql
-
安装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等软件连接数据库 -
进入容器mysql
docker exec -it mysql bash -
进入数据库 p后面跟你的密码
mysql -uroot -pXXX
查看docker run启动参数命令
- 安装runlike即可
pip install runlike - 查看docker run 启动参数
runlike -p <容器名>|<容器ID>
其他
Docker容器中文支持及时区设置问题
Docker存储目录迁移
web容器连接mysql容器简洁方式
nginx容器往多web容器转发请求
未完待续。。。。。。