Docker从入门到实践

171 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 testnightly 三个更新频道。

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