文章目录
开始之前
docker 是一个开源的应用容器引擎。
Docker 官网:https://www.docker.com
Github Docker 源码:https://github.com/docker/docker-ce
1、docker安装
1.1、下载和安装
linux下安装doker:
centos下,查看centos的版本:cat /etc/redhat-release
需要版本在6.5以上
(这里我的是centos 8,8以下的版本,以下步骤可能并不适用)
1、安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加yum仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache
3、安装docker-ce
先输入
dnf -y install docker-ce --nobest
若报错根据提示输入
dnf -y install docker-ce --allowerasing
4、设置开机自启
systemctl enable --now docker
5、添加当前用户到docker group
usermod -aG docker $USER
newgrp docker
6、查看docker版本
docker version
2、运行与停止
查看docker的运行状态
systemctl status docker
查看状态后,按q退出
启动docker
systemctl start docker
关闭docker
systemctl stop docker
在centos7以前启动docker指令是:service docker start
3、从docker的镜像仓库下载
这里我使用阿里云的镜像,也可以使用网易的镜像。
阿里云镜像网址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
修改docker配置文件,并重启docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://239fj6jx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
如上指令可以直接在终端运行,也可以改成如下方式执行
如果是centos7以下版本指令不同
注意这上面的https:/后面的内容,每个人的是不一样的
查看是否配置成功:docker info
如果想使用网易云的镜像,可以把地址换成http://hub-mirror.c.163.com
4、运行
1、docker 镜像:镜像就是一个未运行的文件
2、docker 容器:容器里面装着一个正在运行的镜像
3、docker每次运行一个镜像是就会生成一个容器,我们可以对容器进行开始、暂停、删除等操作,还可以用同一个镜像开多个容器(容器就像一个类的new多个对象一样)
4、docker的文件系统原理:UnionFS (联合文件系统)
例如一个tomcat的镜像
4.1、运行hello-world
用docker运行hello-world,输入指令
docker run hello-world
得到如下结果
也就是docker会先在本地找,有没有hello-world这个项目,如果没有就去云端找。
4.2、镜像命令
1、列出本地仓库镜像
docker images
后面可以追加指令:-a(列出所有)、-q(只显示镜像id)、–digests(显示摘要)、–no-trunc(显示完整信息)
例:
2、从docker官网查找某个镜像
docker search 镜像名
后面可以追加指令:-s(按收藏排名查)、–automated(只查automated类型镜像)、–no-trunc(显示完整信息)
例:
3、下载镜像(配置后从阿里下载)
docker pull 镜像名
后面可以追加版本号:不写表示最新的版本
例:
4、删除某个镜像
docker rmi 镜像名
强制删除:docker rmi -f 镜像名
如果想删除多个,直接在后面写多个镜像名就可以了,空格分隔
全部删除:docker rmi -f $(docker images -qa)
删除容器:docker rm
4.3、容器命令
先用docker下载一个centos
docker pull centos
启动一个镜像的指令
常用参数:
更详细的参数
-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: 绑定一个卷
根据centos镜像id,运行
-it 就是运行后打开 镜像软件的终端
后台静默启动
-d就是后台启动
后台启动后会马上被关闭
如果想让它后他一直运行着,得给他一个一直运行的任务
docker run -d centos /bin/sh -c "while true;do echo hello kkkkk;sleep 2;done"
输出日志试试
现在我们查看docker运行的进程 和 查看docker容器里的centos的docker运行的进程
输入exit退出docker
上面输入的exit退出docker,是完全退出,
使用快捷键ctrl+P+Q就是暂时退出。
如下是我用同一个镜像id,运行的两个容器
查看历史运行的docker内容
查看所有容器(-a:包括运行的、没运行的)
docker ps -qa
查看正运行的容器
docker ps -q
下面是docker ps 指令的参数
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
删除一个容器
docker rm -f 容器id
删除所有容器
docker rm -f $(docker ps -qa)
删除所有容器也可以这样写:docker ps -qa | xargs docker rm
查看容器日志
docker logs -f -t --tail 数字 容器id
-t:加入时间戳
-f:最新日志
–tail:显示多少条
执行容器的指令
docker exec -t 容器id 容器指令
从容器内拷贝文件到主机
docker cp 容器id:文件路径/文件名 主机路径
4.4、提交镜像
提交镜像
docker commit
-m:提交的描述信息
-a:作者
5、docker 常用指令集合
systemctl status docker 查看状态
systemctl start docker 启动docker
docker images 查看本地镜像
docker pull 镜像名 下载镜像
docker run -it 0d120b6ccaa8 根据id运行一个镜像(生成容器),并打开其终端
exit 退出镜像的终端(会结束容器)
ctrl+P+Q 暂时退出容器的终端
docker ps 查看正运行的容器
docker ps -a 查看所有容器
docker start 容器id 开始一个容器
docker stop 容器id 停止一个容器
docker kill 容器id 强行停止容器
docker rm -f 容器id 删除一个容器
docker top 容器id 查看容器里的进程
docker logs 容器id 查看日志
docker inspect 容器id 查看每层的结构
docker attach 容器id 重新进入容器
docker exec -t 容器id 容器指令 使用正在运行容器执行容器的指令
docker cp 容器id:文件路径/文件名 主机路径 (复制文件到主机)
docker inspect 容器id 获取容器/镜像的元数据
docker run -it -p 8888:8080 tomcat:80 (使用外部主机端口8888启动)
docker commit -a="zhangshan" -m=“我改过的tomcat“ eb493a2a75fd mydemo/tomcat1000:1.0 (保存正在运行的容器为一个新镜像)
docker run -it -v /share-a:/share-b tomcat:8.0 (建立共享文件夹启动)
部分指令解释
6、docker运行tomcat镜像实例
先下载一个tomcat8.0
运行
-p(小写的p):这里的8888是主机对外暴露的端口,8080是tomcat的端口
例如这里我的主机是192.168.90.22
如果把如上指令的p小写改成大写P,就会自动分配ip地址
如果想要编辑tomcat里面的东西
把修改后的tomcat打包成一个新的镜像
docker commit -a="zhangshan" -m=“我改过的tomcat“ eb493a2a75fd mydemo/tomcat1000:1.0
如果想运行的时候,让tomcat在后台运行
7、docker容器数据卷(共享文件夹)
7.1、主机和容器间使用共享文件夹
容器数据卷:就是实现主机和容器间共享文件夹
查看共享文件夹绑定成功没:docker inspect 容器id
找到Binds,有内容就是绑定成功了
现在主机的share-m下新建一个host.txt
在对应的share-n里面能找到host.txt
带权限的共享文件
ro表示 容器里只有写的权限
如果遇到报错
例:
7.2、DockerFile(例,建多个共享文件夹)
DockerFile是一个镜像的构建文件
构建docker file文件
输入内容
# volume test
FROM centos
VOLUME ["/s1","/s2"]
CMD echo "finished,-----success1"
CMD /bin/bash
上面内容大致意思就是 继承自centos,容器卷文件夹s1、s2
构建(执行)dockerfile文件
查看生成的镜像
现在运行我们自己生成的mycentos(含s1、s2两个共享文件夹)
在s1里面新建一个01.txt
查看主机共享目录
复制这两个路径
在主机内进入这个目录,看看有没有我们新建的文件01.txt
7.3、容器间共享文件夹
运行两个镜像,让镜像2的volums来自镜像1
现在镜像1、镜像2、主机之间,三者的文件都是共享的
然后再新建一个镜像3,三个镜像互相共享,3和2都继承自1,
发现3与2、1、主机互相共享,
如果再新建一个镜像4,继承自3,然后删除3,
4与2、1、主机依然共享。
步骤总结:
首先新建一个DockerFile文件,
然后docker build生成一个新的镜像
运行这个镜像就可以让它和主机共享多个文件夹
想让其他镜像也和它共享,就让其他镜像继承自这个镜像
7.4、DockerFile文件语法
7.4.1、基础知识
1、dockerFile的保留字必须是大写,且后面至少跟一个参数
2、指令从上到下顺序执行
3、#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
7.4.2、dockerfile的保留字
1、FROM 后面跟一个镜像,也就是当前镜像继承自哪个镜像
2、MAINTAINER 跟作者名字、邮箱
3、RUN 容器构建时要执行的命令
4、EXPOSE 容器对外暴露的端口
5、WORKDIR 指定容器登录后的工作目录
6、ENV 设置环境变量
ENV例:
ENV MY_PATH /usr/mytest
WORKDIR $MY_PATH
7、ADD 拷贝进镜像(可以处理URL和tar压缩包)
8、COPY 拷贝进镜像
COPY例:
COPY src dest
COPY["src","dest"]
9、VOLUME 容器数据卷(共享文件夹)
10、CMD 指定容器要运行的命令
cmd 可以有多个,只有最后一个有效,并且会被docker run之后的参数替换
CMD 例:
CMD <命令>
CMD ["可执行文件","参数1","参数2"...]
11、ENTRYPOINT 指定容器要运行的命令(可以有多个指令生效)
12、ONBUILD 本镜像被继承后出发oubuild
7.4.3、CMD、ENTRYPOINT案例对比
首先要知道基础镜像scratch,docker hub中99%的镜像都FROM自它。
案例一:我们来新建一个mycentos镜像,使得它有如下功能:
vim
更改登录后的默认路径
支持ipcongfig指令
1、新建文件Dockerfile,并编写如下内容
2、构建新镜像
3、运行
4、列出镜像历史
案例二:
新建文件Dockerfile3,并填入一下内容
构建
运行
docker run -it myip相当于在myip容器里面运行了 curl -s http://ip.cn
如果我们现在运行docker run -it myip -i,会报错
因为这相当于curl -s http://ip.cn被覆盖了
如果我们想能在后面追加-i,需要在dockerfile里面用到ENTRYPOINT指令
7.4.4、ONBUILD案例
ONBUILD例:
把这个镜像打包成myip_father
然后再新建一个dockerfile,保存成镜像并运行
8、自定义tomcat 9镜像
首先下载好jdk 1.8和tomcat 9
新建一个Dockerfile文件如下
构建新tomcat镜像
如上,在目0录起名dockerfile文件叫Dockerfile这个名字,构建时 就不需要”-f 文件名“
运行镜像,并配置共享文件夹、端口
把如上图命令分开写
–privileged=true,使得该容器拥有主机的root权限
关于权限参考这篇:https://blog.csdn.net/liuwei0376/article/details/100310462
用这个tomcat发布一个web工程
第一步:主机上,把web工程拷贝进共享文件夹
拷进去过后可以查看容器里有没有
然后重启容器
docker restart 容器id
9、安装mysql
下载mysql5.6
docker pull mysql:5.6
运行
重新进入容器
docker exec -it 容器id /bin/bash
在容器里登录mysql
mysql -uroot -p123456
在主机输入指令导出mysql所有数据
docker exec 容器id sh -c 'exec mysqldump --all-databases -uroot -p123456' > /myfile/all-databases.sql
10、安装redis
下载redis3.2
docker pull redis:3.2
运行
在主机里编写配置文件
写完配置文件,启动redis命令
docker exec -it 容器id redis-cli
然后编写redis的缓存内容
查看持久化文件是否生成
11、将本地镜像发布到阿里云
先将一个运行后,配置好的镜像打包
登录阿里云docker管理平台
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
先创建一个命名空间
然后再创建一个镜像
然后将镜像推送到阿里云
先找到对应的仓库,点管理
找到将镜像推送到Registry
如上图在主机上输入第一句后会让你输入用户名和密码
如果设置的共有仓库,那么在阿里云里面就可以搜索到并下载