Docker 学习笔记
最近,对微服务有点兴趣,就去学了一下docker,了解了一些基本的命令以及使用方法,汇成了这篇笔记,当然,还有很多没记下来(因为我还没学完…),后面会慢慢完善……
1. Docker基本组成
-
镜像(Image):
docker镜像类似于一个Class,通过镜像来创建容器,同一个镜像可以创建多个容器。
-
容器(container):
通过镜像创建,启动、停止、删除命令。
-
仓库:
存储docker镜像。
2. 帮助命令
1# 显示docker版本信息
2docker version
3# 显示docker系统信息,包括镜像和容器数量
4docker info
3. 镜像命令
-
查看本地所有镜像
1# 查看本地所有镜像 2docker images
-
搜索镜像
1# 搜索镜像 2docker search 镜像名
-
下载镜像
1# 下载镜像 2# 不写tag 则默认latest 3docker pull 镜像名[:tag]
-
删除指定镜像
1# 删除指定镜像 2# -f 强制删除 3docker rmi 镜像ID/镜像名 [-f]
-
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改,创建自己的镜像
1# 1. 从容器创建本地镜像副本 2docker commit -m "message" -a "author" 容器ID 镜像名:tag版本 3 4# 2. 从Dockerfile构建镜像
-
查看镜像构建历史
1docker history imageID
-
修改镜像名
1docker tag SOURCE_IMAGE[:tag] TARGET_IMAGE[:tag]
3. 容器命令
-
启动容器
1# 通过镜像名 启动容器 2docker run [--name] [-d] [-it] [-p] [-P] 镜像名 [/bin/bash] 3# 参数说明 4# --name="Name" 容器实例名字,用于区分容器 5# -d 后台方式运行,不会自动进入容器 6# -it 使用交互方式运行,进入到容器内部查看内容 7# -p 指定端口映射,例如-p 8080:8080 8# 1. -p ip:主机端口:容器端口 9# 2. -p 主机端口:容器端口 10# 3. -p 容器端口 11# 4. 容器端口 12# -P 大写P,随机指定端口
-
列出容器
1# -a 列出当前+历史运行过的容器 2# -n 列出最近运行过的n个容器 3# -q 仅列出容器ID 4docker ps [-a] [-n=?] [-q]
-
删除容器
1# 根据Id删除容器, 不能删除正在运行的容器 2# -f 强制删除容器,包括正在运行的容器 3docker rm [-f] 容器ID 4# 递归删除所有容器 5docker rm -f $(docker ps -aq)
-
容器操作
1# 启动一个停止的容器 2docker start 容器ID 3# 重启容器 4docker restart 容器ID 5# 停止容器 6docker stop 容器ID 7# 强制停止(杀掉)容器 8docker kill 容器ID
-
进入运行中容器
1# 进入当前正在运行的容器 (通常容器都是以后台方式运行,有时需要进入修改配置或者进行其他操作) 2# 方式1 -----进入容器后开启一个新的终端 (常用),使用exit退出时不会导致容器停止 3docker exec -it 容器id bashShell 4# 例如: docker exec -it 容器id /bin/bash 5 6# 方式2 ------进入创建容器时执行的终端,不会启动新的终端,使用exit退出时会导致容器停止 7docker attach 容器id
-
退出容器
1# 从交互容器中退出,并停止容器 2exit 3# 从交互容器中退出,不停止容器 4Ctrl+P+Q
-
从容器内拷贝文件到主机上
1# 拷贝容器内文件到主机 2docker cp 容器id:容器内路径 目的主机路径 3# 拷贝主机文件到容器内 4docker cp 目的主机路径 容器id:容器内路径 5 6# ---拷贝是一个手动过程 未来可通过 -v 卷技术 实现容器主机同步
4. 常用其他命令
-
日志输出
1# 输出容器日志 2# -tf 显示日志 3# --tail n 要显示的日志条数 4docker logs 容器ID [-tf] [--tail n]
-
查看容器内进程信息
1# 查看容器内进程信息 2docker top 容器ID
-
查看容器的元数据
1# 查看容器的元数据 2docker inspect 容器ID
5. 容器数据卷
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能实现数据持久化,在docker中我们使用卷。
卷就是目录或文件,将主机目录挂载在一个或多个容器中,由docker挂载到容器,是一种数据共享技术。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
-
数据卷使用
1# 使用-v命令挂载 2docker run -it -v 主机目录:容器目录 imagename /bin/bash
-
具名挂载和匿名挂载
1# 具名挂载 2# -v 命令同时指定了卷名和容器内路径 3docker run -d -P --name n1 -v volname:/etc/nginx nginx 4# -v 命令同时指定主机路径和容器内路径 5docker run -d -P --name n1 -v /home/nginx:/etc/nginx nginx 6 7# 匿名挂载 8# -v 命令只指定了容器内路径 9docker run -d -P --name n1 -v /etc/nginx nginx
-
列出所有数据卷
1docker volume ls
-
查看数据卷元数据
1docker volume inspect volume_name
-
设置容器对数据卷读写权限
1# ro readonly 只读 2# rw readwrite 可读可写 3docker run -d -P --name n1 -v volname:/etc/nginx[:ro | :rw] nginx
6. Dockerfile
Dockerfile就是用来构建docker镜像的构建脚本。
-
Dockerfile基本指令
1# FROM 指定基础镜像 例如centos ubuntu 2FROM centos 3 4# MAINTAINER 声明维护者信息 5MAINTAINER jin,497189xxx@gmail.com 6 7# RUN 镜像构建(build)时需要执行的命令 8# 1. shell方式 9RUN 10# 2. exec方式 11RUN ["可执行文件","参数1","参数2"] 12 13# WORKDIR 镜像进入时工作目录 14WORKDIR /home 15 16# VOLUME 主机卷挂载到的目录(容器内) 17VOLUME ["volume01", "volume02"] 18 19# EXPOSE 声明端口 20# 帮助镜像使用者理解这个镜像服务使用的端口,以方便配置映射 21# 在运行时使用随机端口映射时,会自动随机映射EXPOSE的端口 22EXPOSE 8080 3306 23 24# CMD 指定容器启动(docker run)时候执行的命令 25# 可以被docker run命令行参数中指定要运行的命令所覆盖 26# 如果存在多个CMD指令, 仅最后一个生效 27# 1. shell方式 28CMD /bin/bash 29# 2. exec方式 30CMD ["<可执行文件或命令>", "<参数1>", "<参数2>"] 31# 3. 为ENTRYPOINT指令提供参数 32CMD ["参数1", "参数2", ...] 33 34# ENTRYPOINT 类似于CMD指令 35# 不会被docker run命令行参数指定的命令所覆盖,并且这些命令会被作为参数追加到ENTRYPOINT命令后 36# 如果存在多个ENTRYPOINT指令,仅最后一个生效 37ENTRYPOINT ["可执行文件或命令", "参数1", "参数2"] 38 39# ONBUILD 当另一个Dockerfile使用该Dockerfile构建的镜像时执行的命令 40ONBUILD 41 42# COPY 复制文件或目录到容器内指定路径 43COPY [00chown=<user>:<group>] 源路径 目标路径 44 45# ADD 和COPY指令类似 46# ADD优点: 在执行<源文件>为tar压缩文件时,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径> 47ADD 48 49# ENV 构建时设置环境变量 50ENV key value 51ENV key1=value1 key2=value2 ...
-
使用Dockerfile构建镜像
1# -f 文件路径 2# -t target 目标镜像 3# . 上下文路径,docker是C/S,docker在构建镜像时是在docker引擎下完成的 4# 在构建时需要将指定目录下的文件一起打包供docker引擎使用 5# 默认上下文路径是Dockerfile所在路径 6docker build -f dockerfile文件路径 -t 镜像名[:tag] .
7. Docker网络
7.1. Docker0
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接 通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair) Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换)
7.2. 自定义网络
docker0缺点:不支持容器名网络访问
-
查看所有的docker网络
1docker network ls
-
网络模式
- bridge:桥接 (docker默认)
- none:不配置网络
- host:和宿主机共享网络
- container:容器内网络连通 (直接互连,用的比较少,局限大)
-
创建网络
1docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
-
启动容器时指定网络
1docker run -d -P --name name1 --net mynet tomcat
好处:不同的集群使用不同的网络(而不是全部基于docker0),保证集群的安全和健康
-
将容器连接到不同的网络
1# 打通不同网络间的容器通信 2docker network connect mynet containner01
8. Docker镜像发布
8.1. 发布到DockerHub
1# 登录
2docker login
3# 推送到仓库
4docker push USR/IMAGE[:tag]
8.2. 发布到阿里云镜像仓库
详见阿里云官网
9. Docker可视化管理工具
9.1. Portainer
Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。
1# 拉取,启动portainer
2docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
3
4# 浏览器打开访问ip:9000即可进入面板
10. 练习用例
10.1. Docker安装Nginx
1# 搜索镜像 (建议Docker Hub)
2docker search nginx
3# 下载镜像
4docker pull nginx
5# 启动镜像
6docker run -d --name="nginx0" -p 3344:80 nginx
7# 查看是否启动成功
8curl localhost:3344 # 或者直接浏览器打开访问3344端口
10.2. 构建自己的centos
1FROM centos:7
2MAINTAINER Jin<497189xxx@qq.com>
3
4ENV MYPATH /usr/local
5WORKDIR $MYPATH
6
7RUN yum -y install vim
8RUN yum -y install net-tools
9
10EXPOSE 80
11
12CMD echo $MYPATH
- 原文作者:小小呆呆没有脑袋
- 原文链接:https://www.gujin.store/post/2021-10-04-docker-study-note/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。