Docker
1、安装
CentOS安装教程 官网教程,更详细
CentOS安装教程 阿里教程,快速安装
注意:Windows系统安装需要去官网下载客户端。体验一般,但是没有Linux环境,又不想装虚拟机的朋友们可以尝试。使用与Linux版本并无区别。
学习文档&视频
Docker官网学习文档(英文,但全面)
Docker阿里云学习文档
本文笔记主要内容学自bilibiliDocker核心技术与【狂神说Java】Docker最新超详细版教程通俗易懂,自觉不错,大家也可以通过视频快速入门。
2、基本概念
容器:实例对象,是一个集装箱,可以把容器看作简易版的Linux环境;
镜像:只读的模板,用来创建容器。可以创建多个容器,例如mysql redis centOS 等;
仓库:集中存放镜像的。(阿里云与网易云有仓库镜像,可以加速)。
Docker deamon :Docker与外部客户端的通讯接口。后台的进程。
我们把java代码,环境,配置文件…–> images镜像文件 --> Docker容器 容器即可运行j既定内容。
容器与镜像的关系,类似于java的对象
P p1=new P1(); P p2=new P1(); //P相当于镜像,p1相当于容器,可利用镜像创建多个镜像
Doker比虚拟机 瘦在哪里?围绕以下两点叙述:(常考面试题,亲身经历)
- 干掉Hypervisor 操作系统内核—> docker engine
- 不需要硬件资源,利用宿主机的操作系统。(本文中宿主机均指Docker安装所在的电脑/服务器)
Docker的基本使用步骤:
- 安装docker
- 从远程仓库把镜像pull到本地。 (小试牛刀 : docker pull hello-world)
- 利用本地镜像,创建容器。(小试牛刀 : docker run hello-world)
- 启用容器,进入容器。
Docker安装成功后,小试牛刀:
#docker安装成功后,小试牛刀:
#使用 docker --version查看版本,确认安装成功!
docker --version
#把官网demo:“hello-word” 镜像拉取到本地
docker pull hello-world
#利用刚拉取的“hello-word” 创建创建容器,跑起来!
docker run hello-world
#输出结果
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
3、命令
3.1 基本命令
docker search
:从dockerhub上搜索镜像的名字 (docker search -s 30 tomcat --no-trunc )
选项: -s 30 :筛选星标30 --no-trunc : 显示所有信息docker pull
: 下载镜像(从换过的源),可以从dockerhub上搜索结果复制命令。
注意:docker pull tomcat:latest
加版本号,默认latestdocker rmi
(remove image)删除镜像
注意:如果后台有容器运行,需要docker rmi -f hello-world
强制删除
docker rmi h1 h2
删除多个,用空格分开。docker rm
删除容器实例。docker images
查看所有镜像docker ps
查看所有运行的容器信息(常用来查看容器ID )
3.2 容器
-
新建并启动容器:
docker run [optinos] IMAGE
本地有image则用,无则从远处拉
options:
--d
后台 运行容器 // 注意,这里直接单独-d会立即自杀,必须有前台应用才会存活
---name
指定名字
--p
随即端口 -P 指定端口
--i
以交互模式启动
--t
为容器分配一个伪终端(-it 配合使用)eg: docker run -it centos //在docker中使用centos,并直接打开
-
查看运行的容器:
docker ps
(-l:上一个容器 -a 当前和历史; -q:只显示id) -
退出容器 exit
:关闭容器并退出
Ctrl+P+Q`:不关闭容器,退出 (用什么方式重新打开??查看9) -
启动容器:
docker start +id
(ps查id) -
停止容器:
docker stop //温柔
-
强制停止容器:
docker kill //拔电源
-
删除已停止的容器
docker rm 容器ID
删除所有
docker rm -f $( docker ps -q)
//用ps查出所有id,传给rm 全部删除 -
查看容器日志
docker logs -f -t --tail 容器ID
(-t加入时间戳 -f 刷新日志)
查看容器内部进程docker top 容器ID
-
进入正在运行的容器
docker attach 容器ID
进入容器
docker exec 容器ID
进入容器 或 (不进去)执行一个任务 很重要!
eg:
docker exec -it ID /bin/bash
//进入主机
docker exefc ID ls
//不进入,执行ls
命令
docker attach
与docker exec
的区别详细看我的另一篇博客docker exec 和 docker attach的作用与区别
- 从容器中拷贝数据到主机
docker cp 容器ID:/tmp/a.log /root
//把a.log 拷贝到主机/root下
3.3 镜像
- 特点:一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。包括代码,云从事,库,环境变量,配置文件。
UnionsFS联合文件系统:一种分层,轻量级的文件系统。对文件系统的修改作为一次提交层层叠加。是docker分层继承的基础斜体样式。 - Docker加载原理:bootfs+rootfs。
- bootfs :包括最基本命令,工具,程序库(内核来自宿主机) ;
- rootfs :控制Centos,Ubntu等发行版本。
思考 :Centos与Ubntu的Linux版本中,bootfs是否相同?
——相同
UnionsFS联合文件系统的优点?
—— 复用,共享资源。
- 对镜像的操作
docker commit
提交容器副本,保存修改过后的容器,成为一个新的镜像 .
当我们run一个容器后,对容器内容进行了修改时,可以保存此容器,作为一个新的镜像。
docker commit -m="描述" -a="作者" 容器ID 目标镜像名字:[标签名]
案例学习:
- 输入以下命令(二选一),运行tomcat容器
docker run -it -p 8888:8080 tomcat
(小写p,主机端口:容器端口)
docker run -it -P tomcat
(大写P,随机分配端口)- 运行后,从浏览器输入localhost:8888,查看tomcat效果。
- 从容器中删除“/usr/local/tomcat/webapps/doc”文件,再次查看浏览器中tomcat选择”DOC“发现 notfound。删除效果出现。
- 现在,把这个缺少doc文件的tomcat容器保存为新镜像!
- docker commit -m=“new tomcat” -a=“mynqme” 容器ID newtomcat:tag
- docker run -it -P newtomcat:tag
- 查看发现doc已经不见了!
Tips:目前新版本tomcat容器运行并不能在浏览器查看到主页,大家理解上述过程的意义即可!(如果理解有误欢迎提出)
4、Dockerfile
先认识以下几个关键字:
From :基于**创建
ENV: 配置环境
EXPOSE :暴露端口
CMD :启动
再来了解一个概念——容器卷:
保存容器中数据,数据持久化。容器之间,主机与容器之间,共享数据。相当于挂载!可以使得主机与容器内同步更新!
容器卷的两种使用方式:
1.使用命令,在创建镜像时直接添加容器卷。直接举例说明:
docker run -it -v /主机绝对路径:/容器内目录 镜像名
docker run -it -v /主机绝对路径:/容器内目录:ro 镜像名
只读
2.在dockerfile中编写,使用VOLUME指令
VOLUME["/file1","/file2","/file3"]
//只支持容器内的目录,不支持宿主机目录(为了可移植性)
docker inspect ID
//查看挂载在主机的目录
容器间传递共享:
docekr run --volumes-from 容器名 镜像名
eg: docker run -it --name dc02 --volumes-from dc01 zxd/centos //dc02 与dc01 共享文件!!
//思考:当dc01被kill ,文件是否还存在?——存在,且共享均保持
看完上边是不是有点晕,我们通过一个案例来了解一下dockerfile的真面目!
案例学习:
- 编写dockerfile,并保存(命名为dockerfile)。使用
VOLUME
留下两个容器卷,等待绑定。
#volume test
#基于centos创建
FROM centos
#新建两个容器卷
**VOLUME["/datafile1","/datafile2"]**
CMD echo "finished,success1"
#以shell 终端登陆
CMD /bin/bash
-
build 利用dockerfile生成images
在磁盘中找到上述步骤中的文件,并运行以下命令生成镜像:
例如:docker build -f /root/dockerfile -t dong/mycentos .
注意末尾这里有个空格和点!! -
run 运行生成的新镜像
注意这条命令,-v后面的格式: 宿主机目录:容器卷名称 绑定宿主机与刚才留下的两个容器卷!
docker run -it -v /host1:/datafile1 -v /host2:/datafile2 dong/mycentos /bin/bash
-
改变宿主机中的host1中的文件,容器内datafile1中的文件会同时改变!
- 划重点:
docker build -f /filepath/file -t namespace/name .
编译dockerfile,生成镜像
docker run namespace/name
运行生成的镜像 - 步骤三中命令较长,来分析一下:
-it
代表前台运行此容器(否则容器可能启动了一下,你看不到,它自己就关了);
-v
代表绑定容器卷(我们对本机中host1操作容器中的datafile1会同时变化,host2同理);
/bin/bash
代表接下来使用bash语法进行交互。
- 划重点:
Dockerfile
内容较多,一张图简说。图片来自哔哩哔哩尚硅谷视频教程
scratch:所有镜像文件的基础镜像,元数据,元镜像 ,祖先类
常用关键字
CMD与ENTRYPOINT
在dockerfile中,CMD
关键字可以使用多次,可是只有最后一个有效,且会被docker run
之后的参数替换!**
ENTRYPOINT
功能比CMD强大,可以使用多次,docker run
之后的参数会追加上去,不会被替换。
首先你要了解的内容:
小知识:
curl cip.cc
可以用来查ip
curl cip.cc -i
可以用来查带报头的ip
(Windows中的控制台也通用哦)
如果想要使用追加参数需要把ENTRYPOINT
后边的命令写成字符串拼接的方式,
我们分别使用CMD和ENTRYPOINT关键字编写dockerfile,生成两个image(命名为centos-CMD/centos-ENTRYPOINT)。
下面只是两个dockerfile中的不同部分。
ENTRYPOINT ["curl","cip.cc"]
CMD["curl","cip.cc"]
下面,我们看CMD与 ENTRYPOINT的效果:
docker run -it centos-CMD:ip
docker run -it centos-ENTRYPOINT:ip
#此时CMD与 ENTRYPOINT效果相同,均可以查到ip
docker run -it centos-CMD:ip -i
docker run -it centos-ENTRYPOINT:ip -i
#报错!!
此时CMD与 ENTRYPOINT效果是不一样的 ,
而使用ENTRYPOINT生成的镜像,-i
会把追加在命令后边, curl cip.cc -i
使用CMD生成的镜像,-i
会把CMD中的内容都替换掉,curl cip.cc -i
因此报错 !
5、实战
5.1 mysql 使用
- 拉取镜像这里不再赘述,重点在于启动时的命令。
- 运行镜像。启用命令:
docker run -p 1234:3306 --name mysql
-v /zxd/mysql/conf:/etc/mysql/conf.d
-v /zxd/mysql/logs:/logs
-v /zxd/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.6
命令解析:
docker run
#设置端口,宿主机端口为1234(可自定义),容器内端口为3306(固定不可变)
-p 1234:3306 --name mysql
#创建配置的容器卷(三个)
-v /zxd/mysql/conf:/etc/mysql/conf.d
-v /zxd/mysql/logs:/logs
-v /zxd/mysql/data:/var/lib/mysql
#设置密码
-e MYSQL_ROOT_PASSWORD=123456
#后台启动镜像
-d mysql:5.6
- 使用
docker ps
查看容器id - 用
docker exec -it ID /bin/bash
进入容器 - 使用
mysql -uroot -p
进行内部数据库操作 - 也可通过本机的ip:1234端口来连接数据库
注意,由于docker中不能使用ifconfig查看ip,可以使用
cat /etc/hosts
查看ip
onf.d
-v /zxd/mysql/logs:/logs
-v /zxd/mysql/data:/var/lib/mysql
#设置密码
-e MYSQL_ROOT_PASSWORD=123456
#后台启动镜像
-d mysql:5.6
1. 使用`docker ps` 查看容器id
2. 用`docker exec -it ID /bin/bash` 进入容器
3. 使用`mysql -uroot -p`进行内部数据库操作
4. 也可通过本机的ip:1234端口来连接数据库
> 注意,由于docker中不能使用ifconfig查看ip,可以使用`cat /etc/hosts` 查看ip