Docker笔记
1、Docker安装
1.1 查看内核版本
uname -r
查看linux系统的系统内核,推荐3.10以上版本。
1.2.查看系统版本
cat /etc/os-release
1.3 安装
- 在安装前最好先更新yum软件包索引:
yum makecache fast
- 需要的安装包:
yum install -y yum-utils
- 设置镜像仓库:
yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker:
systemctl start docker
- 启用docker:
systemctl start docker
- 查看docker是否安装成功,查看版本:
docker version
- 运行hello-world:
docker run hello-world
- 查看一下hello-world:
docker images
1.4 卸载docker
- 卸载依赖:
yum remove docker-ce docker-ce-cli containerd.io
- 删除资源:
rm -rf /var/lib/docker
1.5 docker run hello-world的整体流程
run以后,Docker在本机寻找hello-world这个镜像,如果有,直接运行,如果没有,去docker hub上去下载。下载又有两种情况:(1)找不到,返回错误提示信息(2)下载到本地,然后在本地能找到hello-world这个镜像了,运行这个镜像。
2、底层原理
2.1 Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。
Docker_Server接收到Docker_Client的指令,就会执行这个命令。
2.2 Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,VM需要的是Guest OS
所以说,新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂过程,
3、Docker的常用命令
3.1 帮助命令
docker version
查看docker版本信息
docker info
更详细的一些docker信息
docker --help
帮助命令
帮助文档的地址:命令行帮助文档
3.2 镜像命令
3.2.1 docker images
查看所有镜像
其中:
- REPOSITORY:镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像的ID
- CREATED:镜像的创建时间
- SIZE:镜像的大小
docker images --Options
Options: - a:显示全部的镜像
- q:只显示镜像的id
3.2.2 docker search
搜索镜像
可通过stars来过滤
3.2.3 docker pull
下载镜像
[wangxi@aisvr ~]$ docker pull python:3.7
3.7: Pulling from library/python #不写版本号,默认下载最新版
d960726af2be: Already exists #分层下载,docker image的核心 联合文件系统
e8d62473a22d: Already exists
8962bc0fad55: Already exists
65d943ee54c1: Already exists
532f6f723709: Already exists
1334e0fe2851: Already exists
ba365db42d14: Pull complete
9c5512e22a86: Pull complete
9b39d3d20df6: Pull complete
Digest: sha256:2418d2580b0696cfe3e924ada34478dc30e5dbdf2cfd06158a3553e4608aae53 #签名
Status: Downloaded newer image for python:3.7
docker.io/library/python:3.7 #下载的真实地址
#docker pull python:3.7 等价于 docker pull docker.io/library/python:3.7
3.2.4 docker rmi -f 镜像ID
强制删除镜像
删除多个镜像:
docker rmi -f 镜像ID1 镜像ID2 镜像ID3
删除所有镜像:
docker rmi -f $(docker images -aq) #依据镜像的ID进行递归删除
3.3 容器命令
说明:有了镜像才可以创建容器
3.3.1 新建容器并启动进入
docker run [可选参数] image
"""
可选参数:
--name='Name' #容器名字
-d #后台方式运行
-it #使用交互方式进行 一般还会再最后加上/bin/bash 进入交互界面
-p 主机端口:容器端口 #指定容器端口 可接多个端口,一个-p可设置一个端口映射
-P #随机指定端口
"""
3.3.2 列出所有运行的容器
docker ps [参数] #查看当前运行的容器
"""
:列出当前运行的容器
-a:列出当前运行的容器+历史运行过的容器
-n=?:最近创建的?个容器
-q:只显示容器的编号
"""
3.3.3 退出容器
exit #直接停止容器并退出
ctrl+P+Q #容器不停止退出
3.3.4 删除容器
docker rm 容器id #删除指定容器
docker rm if $(docker ps -aq) #删除所有容器
dockers ps -a -q|xargs docker rm #删除所有容器
3.3.5 启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止容器
3.4 常用其他命令
3.4.1 后台启动容器
docker run -d 镜像名
3.4.2 查看日志
docker logs
3.4.3 查看容器中的进程信息
docker top 容器id
3.4.4 查看容器的元数据
docker inspect 容器id
3.4.5 进入当前正在运行的容器
#通常容器都是后台运行的,需要进入容器,修改一些配置
#方式1,进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 容器id /bin/bash
#方式2,进入容器正在执行的终端,不会启动新的进程
docker attach 容器id
3.4.6 从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的地主机路径
3.4.7 查看cpu状态
docker stats
3.5 小结
3.6 小案例1
安装tomcat
-
下载tomcat
docker pull tomcat
查看一下:
docker images
结果为:
-
启动运行
docker run -d -p 3355:8080 --name tomcat_test tomcat
-d 后台运行,-p将tomcat的8080端口和服务器的3355端口进行连接,–name 取名为tomcat_test -
在外网访问
-
进入镜像查看
docker exec -it tomcat_test /bin/bash
随后进入webapps发现里面没有任何文件,从而导致了访问网站没有页面显示。
原因:直接pull。默认安装最小的最新的镜像,所有不必要的都剔除了。只保证最小可运行的环境。 -
将webapps.list文件复制到webapps里
cp -r webapps.dist/* webapps
-
有页面了
思考:我们以后要部署项目,每次进行修改都需要进入容器是不是很麻烦?要是可以在容器外部提供一个映射路径,在外部放置项目,就自动同步到内部就好了
4、Docker镜像讲解
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
4.1 commit镜像(提交镜像)
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像。
docker commit -m='提交的描述信息' -a=’作者‘ 容器id 目标镜像名:[TAG]
目标镜像名自己取。
先查看现有容器:
commit镜像:
创建一个名称为python3.7的镜像,版本为1.0,作者是‘wangxi’。
查看现有镜像:
5、容器数据卷
5.1 什么是容器数据卷
docker理念回顾:将应用和环境打包成一个镜像!
但是此时,数据都在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化所以需要容器之间可以有一个数据共享的技术。docker容器产生的数据,同步到本地!这就是卷技术!
目录的挂载,将容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的。
5.2 体验使用容器数据卷
5.2.1 方式1:直接使用命令来挂载 -v
查看现有镜像:
挂载:docker run -it -v 主机目录:容器目录 image id /bin/bash
只能使用image id不能再使用repository替代。
将 4fe8dd68fa7d这个镜像的home目录文件后台挂载到主机test目录。
使用inspect查看具体信息:docker inspect 8cfe51fa95ea
可以查看到相关的挂载信息。
在容器内进行数据修改:
在容器内的home目录下新建了一个test_data.py文件,此时在linux主机的test文件里:
只要容器未删除(可以取消服务),在主机上对文件内容进行修改,docker容器中的文件也会做相应修改。
可能公司处于安全考虑,对于从容器中映射到主机上的文件,用户只有只读权限
5.3 具名挂载和匿名挂载
5.3.1 -v 使用
当使用-v进行挂载时,如果没有写主机路径,只接了容器路径,系统会自动设置一个映射路径。
docker volume +【参数】
docker run -d -v 容器映射名:容器
在挂载时,若-v 映射名:容器路径,这种有映射名的就是具名挂载,可使用docker volume inspect 容器映射名
查看该数据到底存放在哪里。
所有的docker容器内的卷,没有指定目录的情况下,都是在/var/lib/docker/volumes
路径下。
5.3.2 具名挂载、匿名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
docker run -d --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
在容器路径后面出现了一个ro
或者rw
,是改变读写权限的。
ro
:read only,只能通过宿主机进行文件更改操作
rw
:read write
5.3.3 容器间进行数据共享
容器间可以实现数据挂载进而实现数据共享
docker run -it --name 容器2 --volumes-from 容器1 镜像id
注意:需要容器1本身存在挂载的数据卷。
6、Dockerfile
Dockerfile就是用来构建docker镜像的构建文件。
6.1 体验
6.1.1 创建一个dockerfile文件
创建一个dockerfile
内容为:
FROM python:3.8
VOLUME ['dockerfile_volume1']
CMD echo '----end----'
CMD /bin/bash
项目参考Dockerfile:
FROM python:3.7-slim
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt && \
mv data /root/.dgl
EXPOSE 8041
CMD python main.py
其中:
python:3.8 为想创建的镜像,版本号进dockerhub中查找。
VOLUME 为匿名挂载卷
6.1.2 创建一个镜像
docker build -f dockerfile1 -t python_wang .
其中:
-f 后的dockerfile1 为dockerfile
-t 后的python_wang 为镜像名称
. 是生成在当前目录下
随后运行起来,可使用docker inspect 容器id
查看镜像的挂载情况。
6.2 构建步骤
- 编写一个dockerfile文件
- docker build 构建一个镜像
- docker run 运行镜像
- docker push 发布镜像
6.2.1 Dockerfile构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
步骤:
Dockerfile:构建文件,定义了一切的步骤、源代码
DockerImage:通过Dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
6.2.2 Dcokerfile的指令
FROM #基础镜像,一切从这里开始
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #构建镜像时需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留的端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile 这个时候就会运行 ONBUILD 的指令。触发指令。
COPY # 类似ADD,将文件拷贝到镜像中
ENV #构建的时候设置环境变量
拓展:CMD和ENTRYPOINT的不同
Dockerfile
FROM centos
CMD ["ls","-a"]
使用build创建镜像:docker build -f Dockerfile -t cmdtest .
运行该镜像:docker run 镜像id
镜像会执行 ls -a
如果追加指令,如:docker run 镜像id -l
则会报错,系统将Dockerfile中CMD命令改为了 -l,所以找不到这条指令。
而如果Dockerfile最后一行是:ENTRYPOINT [“ls”,"-a"]
build创建镜像并在运行该镜像是追加一条指令 -l
相当于执行了 ls -al
实战:Tomcat 镜像
1、准备镜像文件、tomcat压缩包、jdk的压缩包
2、编写Dockerfile
Dockerfile是官方命名,build会自动寻找这个文件,就不需要-f 指定文件路径了。
Dockerfile文件内容:
FROM centos #拉取基础镜像
MAINTAINER 作者名字<邮箱>
COPY readme.txt /usr/local/readme.txt #将当前文件夹下的readme.txt复制到镜像的/usr/local/路径下
ADD jdk-8ull-linux-x64.tar.gz /usr/local #将jdk压缩文件解压到镜像的/usr/local/目录下
ADD apache-tomcat-9.0.22.tar.gz /usr/local #将tomcat压缩文件解压到镜像的/usr/local/目录下
RUN yum -y install vim #让基础镜像拥有vim功能
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
EXPOSE 8080 #暴露8080端口
6.3 发布镜像到DockerHub
1、在dockerhub注册账号
2、确定这个账号可以登录
3、在服务器提交镜像
4、登陆完毕提交镜像
在服务器登录docker
docker login -u 账号
随后会提示你输入密码
随后docker push REPOSITORY:TAG
若出现已存在版本
可使用docker tag 镜像id 新的镜像名称:版本号
然后提交新的镜像。
6.4 发布到阿里云镜像
实际使用:
(1)登录指定docker镜像仓库
(2)
7、Docker所有流程
将镜像打包成压缩文件:
docker save 镜像id -o 文件名.tar
可以再压缩(非必要):
gzip 文件名.tar
如何加载打包好的docker tar包:
docker load tar包
8、Docker网络
其中,lo为本机回环地址,eth0为内网地址,docker0为docker0地址。
每启动一个docker容器,docker就会给这个容器分配一个ip,并且本地也会生成一个网卡与之对应(veth_pair技术)。
容器之间虽然是隔离的,但容器间的网络是通过桥接模式进行连通的。
所有的容器在不指定网络的情况下,都是通过docker0进行路由的,docker会给容器分配一个默认的可用IP。
Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!
只要容器删除,对应的一对网桥就没了。
如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器