一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
Docker包括三个基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker镜像
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
Docker容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
Docker Registry
一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
安装 Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable test 和 nightly 三个更新频道。
Docker常用命令
查看docker本地镜像 docker image ls
搜索镜像 docker search mysql
下载镜像 docker pull mysql
删除镜像 docker rmi IMAGE ID
全部删除 docker rmi $(docker images -q)
获取镜像元信息:docker inspect 镜像ID或者镜像名称:TAG
镜像仓库
地址:https://hub.docker.com/
登录:docker login
更改镜像名称(docker官方镜像仓库是以用户名来命名仓库)
docker tag username/soft:version newusername/soft:version
推送镜像到官方仓库
docker push name/soft:version
查看效果
1.删除docker image rm -f xxxx
2.拉取docker pull tomcat:TAG
3.运行docker run xxx
容器管理
停止容器 docker stop 容器ID
启动容器docker start 容器ID
强制停止容器docker kill 容器ID
重启容器docker restart 容器ID
删除已经停止的容器docker rm 容器ID
删除正在运行的容器docker rm -f 容器ID
解决容器内无法使用ll命令问题
echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
运行容器
docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG
查看日志docker logs 容器ID或者容器名
进入正在运行的容器:
docker exec -it 容器ID或者容器名 /bin/bash
拷贝文件
docker cp 主机文件路径 容器ID或者容器名:容器路径 #主机中文件拷贝到容器中
docker cp 容器ID或容器名 主机文件路径 #容器文件拷贝到主机中
获取容器元数据docker inspect 容器ID或容器名称
容器之间的网络通信link
mysql需要指定宿主机挂载目录-v 目录
docker 生成镜像的两种方式
1.更新镜像docker commit
2.构建镜像docker build,需要创建Dockerfile文件
ADD和COPY的区别
COPY用于从宿主机复制文件到创建的新镜像文件
COPY <src>...<dest>
COPY ["src",..."<dest>"]
ADD基本用法和COPY指令一样,ADD支持使用TAR文件和URL路径
ADD <src>...<dest>
ADD ["src",..."<dest>"]
启动UI
- -d 创建一个守护式容器在后台一直运行
- -p 端口映射:指定容器暴露的端口9000:9000,前者是宿主机端口:后者是容器内端口
- -restart = 指定容器停止后的重启策略:
no 容器退出时不重启
no-failure 容器故障退出(返回值非零)时重启
always 容器退出时总是重启
- -v 给容器挂载存储卷,挂载到容器的某个目录 宿主机目录:容器目录
- --name 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
- --rm=false,指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
- 为什么要做目录映射,因为:容器里的系统不能直接去上传文件。
docker run -d -p 9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-arry portainer/portainer
查看容器
docker ps -a
运行容器
docker run -itd -p 8888:8888 -p 888:888 -p 80:80 -p 3306:3306 --privileged=true -v /Users/shawnsun/Sites:/www/wwwroot --name=baota afb6fca791e0 /usr/sbin/init
进入容器
docker exec -it f0817ab1da91b68127073f00e5b619067448f54105bc58063b964824
86d5e77e /bin/sh