镜像
常用连接:
docker 镜像仓库:https://registry.hub.docker.com/
docker操作文档: https://docs.docker.com/
1. 查看本地镜像: docker images
docker images -q 只显示镜像id
2. 搜索镜像 :docker search [镜像名]
docker search golang
3. 从docker hub拉取镜像到本地: docker pull [镜像名] (不指定tag, 默认拉取最新版本)
docker pull python (拉取的是最新版本)
docker pull python:3.7 (拉取指定版本)
4. 提交镜像到docker hub,docker push [镜像名:tag]
docker push myImage:1.0
5. 删除镜像 docker rmi 镜像名:tag | 镜像id (必须没有 在运行的容器)
6. 删除所有镜像 docker rmi $(docker images -aq)
docker镜像采用分层结构
docker镜像实际是由一层一层的文件系统组成,联合文件系统。
bootfs:主要包含bootloader和kernel,bootloader主要引导加载kernel,linux启动时,会加载bootfs文件系统。docker镜像的最底层就是bootfs。当boot加载完,
整个内核就都在内存中了,此时内存的使用权就交给内核了,此时会卸掉bootfs。
rootfs:在bootfs之上,包含的就是典型的linux系统的文件和目录。rootfs就是各种不同的操作系统发行版,如centos、ubuntu。
平时安装一个centos或Ubuntu可能需要几个G,docker这里只有几百M。其实相当于是精简版的os,rootfs可以很小,包含最基本的命令、工具、程序库,底层直接使用宿主机的kernel,自己有rootfs即可。
好处:资源共享。 比如,有的镜像都是从相同的基础镜像构建而来,那么当pull镜像时,就不会再拉取这个基础镜像了,因为可以共用,而且每一层都可以共用。
docker镜像是只读的,当容器启动时,一个新的可写层加载到镜像的顶层,这一层成为容器层,容器之下叫镜像层。
容器
1. 查看容器 docker ps (只显示当前正在运行的容器)
docker ps -a 查看所有容器
docker ps -aq 查看所有容器id
2. 运行容器 docker run 镜像名:tag | 镜像id (不指定tag,默认运行最新版本)
docker run 的常用参数:
-d 后台运行容器
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机端口:容器端口
--name="golang": 为容器指定一个名称
-h "hostname": 指定容器的hostname
-e pwd="password": 设置环境变量;
--link 添加链接到另一个容器;
-v: 绑定一个数据卷
3. docker start 容器id | 容器名 启动容器
4. docker stop 容器id | 容器名 停止容器
5. docker restart 容器id | 容器名 重启容器
6. docker pause 容器id | 容器名 暂停容器
7. docker unpause 容器id | 容器名 恢复容器
8. docker kill 容器id | 容器名 杀死(停止)容器
9. docker rm 容器id | 容器名 删除容器
10. docker rm $(docker ps -aq) 删除所有容器
11. docker logs 容器id | 容器名 查看容器日志
docker logs -f 实时监控容器日志
12. docker attach 容器id | 容器名 进入容器正在运行的界面
13 docker exec -it 容器id | 容器名 以交互方式进入容器
14 docker cp 容器id:容器目录或文件 主机目录 将容器文件拷贝到主机
15 docker cp 主机目录或文件 容器id:容器目录 将主机文件拷贝到容器
16 docker top 容器id | 容器名称 查看容器中的进程
17 docker inspect 容器id | 容器名称 查看容器元数据
18 docker commit -m "备注" -a "作者" 容器id | 容器名 镜像名:tag
19 docker save 镜像名:tag -o 文件名.tar 备份镜像
20 docker load -i 文件名.tar
数据卷
docker run -v 宿主机绝对路径:容器内路径
docker run -v 宿主机绝对路径:容器内路径:ro
ro:只读, 如果指定,容器内的文件是只读的。 这种方式会将容器路径的原始数据清空,始终以宿主机为主
docker run -v volumeName: 容器内路径
volumName相当于数据卷的别名。 如果这个别名数据卷存在,则直接使用, 不存在创建
数据卷默认目录 /var/lib/docker/volumes/
docker volume 相关命令
docker volume ls 查看数据卷
docker volume create 卷名 创建数据卷
docker volume inspect 卷名 查看数据卷元数据
docker volume rm 卷名 删除数据卷
docker run --volume-from 容器名 继承其他容器的数据卷。当继承容器或被继承容器,以及所挂载主机目录的文件添加修改时,会一起变化。其中一个容器的数据卷删除,不影响其他继承容器。
网络
当docker启动时,会自动在主机上创建一个docker0的虚拟网桥,实际上是linux的一个网桥,可以理解为一个交换机,会挂载到它网口之间进行转发。
docker随机分配一个本地为占用的私有网段中的一个地址给docker使用。
当创建一个容器时,同时会创建一对veth:pair接口,当数据包发送给一个接口时,另一个接口也可以收到。这对接口一个在容器内(eth0),另一端在本地并挂载到docker0网桥,
名称以veth开头。通过这种方式,主机可以和容器通信,容器与容器之间也可以通信。
docker中的网桥类型:bridge, host, null
docker network create -d bridge(默认) 网络名称 创建网络自定义网桥
docker network ls 查看网络列表
docker network inspect 网络名 查看网络详细信息
docker network rm 网络名 删除网络
docker run --network 网络名 ... 启动容器时加入某个网络
docker network connect 网络名 容器id(容器名称) 容器启动之后加入网络
docker network disconnect 网络名 容器id(容器名称) 容器断开已加入网络
Dockerfile
FROM 指定基础镜像
RUN 构建镜像时执行的命令
EXPOSE 容器向外暴露的端口
ENV 容器所使用的环境变量, 可在docker run时通过- e 修改
ADD 复制src路径下的内容到容器dest目录。src可为url会自动下载,也可以是tar文件,且会自动解压
COPY 复制sec路径的内容到容器dest目录,但不会自动解压
LABEL 指定生成镜像元数据的标签信息
VOLUME 容器数据卷挂载点
WORKDIR 配置工作目录,可为CMD、ENTRYPOINT、RUN指定工作目录
CMD 指定启动容器时默认的执行的命令,
ENTRYPOINT 启动容器时执行的命令
CMD & ENTRYPOINT
1. 直接命令方式 python demo.py
2. 数组方式 ["python", "demo.py"]
区别:
1. run: dockerfile中有多个run时,只有一个生效, 在docker run使用命令时会被覆盖
docker run 镜像 其他命令(如 ls)
2. entrypoint:在docker run 指定entrypoint时会被覆盖
docker run --entrypoint 覆盖命令 镜像
使用:
entrypoint用于固定的命令,cmd为entrypoint指定参数
如: entrypoint python
cmd demo.py (如果执行文件有变动,则可直接在docker run时覆盖)
docker-compose
常用命令
docker-compose up 启动项目
docker-compose up 服务id 对当前docker-compose中对应服务id操作
docker-compose up会自动构建镜像,创建服务,启动服务,编排容器
docker-compose up -d 后台启动项目
docker-compose down 关闭项目
docker-compose down 服务id 关闭服务
docker-compose down 会关闭所有容器,并移除网络
docker-compose exec 服务 进入服务(相当于 docker exec)
docker-compose ps 查看在运行的服务
docker-compose restart 重启项目
docker-compose -t 服务id 重启服务
docker-compose start 启动项目
docker-compose stop 停止项目
docker-compose rm -f(强制删除) -v(容器挂载的数据间) 服务id 删除整个项目或某个服务
docker-compose top 服务id 查看项目 或服务运行状态
docker-compose文件常用指令
build 通过docker-compose在启动容器之前根据dockerfile构建镜像
command 覆盖容器启动后执行的命令
container_name 指定启动容器的名称
depends_on 解决容器启动的依赖,启动的先后顺序
当前服务不会等待被依赖服务完全启动才启动
environment 用来给容器启动指定环境变量,相当于 docker run -e
env_file 用来给容器启动指定环境文件,相当于docker run --env-file
expose 用于容器暴露端口
images 用来指定容器启动所使用的的镜像,相当于docker run image(镜像名)
networks 用来指定容器所使用的网桥,相当于docker run -network
ports 用于容器与主机之间的端口映射,相当于docker run -p
volumes 用于数据卷目录的映射,相当于docker run -v
restart 用于指定容器重启的策略,如docker run --restart always