写点什么

Docker 从入门到干事,看这一篇就够了

  • 2022 年 5 月 03 日
  • 本文字数:4016 字

    阅读完需:约 13 分钟

官网地址:[hub.docker.com](()


注册时注意 id 起的复杂一点,很容易重复。


启动 docker 服务


systemctl start docker


拉取镜像


docker pull hello-world


运行镜像


docker run hello-world



查看容器

-a 查看所有

docker ps -a


镜像加速


========


如果刚才拉取镜像时感觉速度过慢可以配置加速,速度正常可跳过此步。


鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决。


网易的镜像地址:[hub-mirror.c.163.com](()


在任务栏点击 Docker for mac 应用图标


Perferences... -> Daemon -> Registry mirrors


在列表中填写加速器地址即可。


修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。


通俗理解什么是 docker?


==============


Docker 的思想来自于集装箱,集装箱解决了什么问题?


在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。


docker 就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker 就是集装箱。


  • 不同的应用程序可能会有不同的应用环境,比如.net 开发的网站和 php 开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如 IIS 和 Apache 访问端口冲突。这个时候你就要隔离.net 开发的网站和 php 开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker 可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

  • 你开发软件的时候用的是 Ubuntu,但是运维管理的都是 centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些 Ubuntu 转 centos 的问题,比如:有个特殊版本的数据库,只有 Ubuntu 支持,centos 不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有 docker 你就可以把开发环境直接封装转移给运维,运维直接部署你给他的 docker 就可以了。而且部署速度快。

  • 在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker 部署的话,这些内存就会利用起来。


总之 docker 就是集装箱原理。


docker 与虚拟机的对比


=============


物理机:别墅


虚拟机:楼房


docker:酒店式公寓


docker 三大概念


==========


库:一个总的仓库,包含所有的镜像,使用时可以从库拉取镜像到本地。


镜像:从库中拉取下来的应用,比如 mysql。


容器:镜像运行之后就是容器,容器和镜像可以互相转换。


docker 工作流程


==========



docker 命令


========


docker 指令基本用法:


docker 命令关键字 -参数


基本操作



查看 docker 信息

docker info

docker 版本

docker version

查找镜像

docker search nginx


#拉取镜像


docker pull nginx


入门案例



快速搭建 wordpress 博客

查找镜像


docker search name

wordpress

mariadb


拉取镜像


docker pull wordpress

mariadb 就是 mysql

docker pull mariadb


运行镜像


docker run --name db -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root -d mariadb


docker run --name mywordpress --link db:mysql -p 8080:80 -d wordpress


运行成功,访问 wordpress


http://libiao:8080


根据提示配置数据库信息,一个个人博客网站就搭建好了



查看端口映射




docker ps


docker port CONTAINER_ID


举例:xxjob 的 8080 端口映射到宿主机的 8089 端口



linux 设置 docker 开机自启




systemctl enable docker


查看镜像




docker images


#因为 docker 是分层,所以显示的文件大小要大于实际占用磁盘的大小


运行镜像




docker run --name db -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root -d mariadb

--name 别名

--env 环境变量

#-d 后台执行


docker run --name mywordpress --link db:mysql -p 8080:80 -d wordpress

--link ip 映射

-p 端口映射

docker logs -f 7a38a1ad55c6

像 tail -f 一样查看容器内日志

docker top name


#查看容器内的进程


删除镜像




docker rmi hello-world:latest


docker rmi id

4 位即可

复合命令




docker rm -f $(docker ps -a -q)


#删除全部容器


查看运行的容器




docker ps


docker compose




一个方便维护多个容器的 yaml 文件,docker 认为一个容器对应一个进程,但一个应用会有多个进程,例如上面的 mysql 和 wordpress。


个人觉得 docker compose 类似于 shell 脚本,但他实际都 python 实现,访问的是 docker 的一些 api。


Docker compose 一般随 docker 一起安装,所以要求版本对应


docker version


docker-compose --version


在 yaml 文件制定镜像的名字,版本,端口映射后用 up -d 启动


docker-compose.yaml up -d


查看日志


docker-compose logs


容器管理


====

进入容器

docker exec -it name /bin/sh

查看容器详细信息

容器的详细信息会以 json 的形式返回。

docker inspect name

[root@lib mysh]# docker inspect mywordpress


[


{


"Id": "6253e66959047c6f8de891abe1c661f7766fdef7407f00e07d1788310e0ea6a9",


"Created": "2021-08-04T20:11:43.649001354Z",


"Path": "docker-entrypoint.sh",


"Args": [


"apache2-foreground"


],


"State": {


"Status": "running",


"Running": true,


"Paused": false,


"Restarting": false,


"OOMKilled": false,


"Dead": false,


"Pid": 28041,


"ExitCode": 0,


"Error": "",


"StartedAt": "2021-08-04T20:11:43.947511209Z",


"FinishedAt": "0001-01-01T00:00:00Z"


}


"Name": "/mywordpress",


......


容器启停


docker start name


docker stop name


docker restart name


删除容器

删除时容器需要处于停止状态

docker rm name


查看日志

docker ps -a

docker logs container_Id


占用资源


docker stats name



镜像特性


====


镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。将所有的应用和环境直接打包为 docker 镜像,就可以直接运行。



镜像名和版本号共同组成唯一标识,默认是最新版——lastest


分层原理




Docker 的镜像通过联合文件系统将将各层文件系统叠加在一起。


引导方式


  • bootfs:传统操作系统,用于系统引导的文件系统,包括 BootLoader 和 kernel,容器启动完成后会被卸载以节省内存资源。



  • rootfs:位于 bootfs 之上,表现为 docker 容器的根文件系统

  • 传统模式中,系统启动时,内核首先挂载为”只读“模式,完成全部自检后挂载为”读写“模式。

  • docker 中,rootfs 由内核挂载为”只读“模式,而后通过 UFS 技术挂载一个”可写“层。


??注意:已有的分层只能读不能写,上层镜像优先级大于底层镜像



当我们使用 pull 命令时,我们可以看到 docker 的镜像是一层一层的在下载。这样做最大的好处就是资源共享了。


比如多个镜像都从 Base 镜像构建而来,那么宿主机只需要在磁盘上保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。查看镜像分层的方式可以通过 docker image inspect 命令。


所有的 Docker 镜像都起始于一个基础镜像,当进行修改或者增加新的内容时,就会在当前的镜像层之上,创建新的镜像层。在添加额外的镜像层的同时,镜像始终保持当前所有镜像的组合, Docker 通过存储引擎的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。


UFS(联合文件系统)




UFS 时一种分层、轻量级并且高性能的文件系统。


它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。


UnionFS 是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件,系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。


加载原理




Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层时 bootfs。


当 boot 加载完成后整个内核就在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。rootfs 在 bootfs 之上,rootfs 包含的就是典型 Linux 系统中的/dev、/proc、/bin、/etc等目录和文件。rootfs 就是各种不同的操作系统发行版。


Docker File


===========


仓库没有的镜像怎么办?



可以自己创建镜像吗?


容器->镜像




docker commit CID -t xx.xx.xx


???????? 工作在前台的守护进程至少一个


网易蜂巢:开源镜像仓库



编写 docker file




Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

指令讲解

FROM


指定基础镜像,必须为第一个命令,有且只有一个

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

FROM mysql:5.6


MAINTAINER


创建者信息

MAINTAINER <name>

MAINTAINER yitiao


RUN


用于在镜像容器中执行命令,其有以下两种命令执行方式:


#shell 执行

RUN <command>

#exec 执行

RUN ["executable", "param1", "param2"]

RUN apk update


RUN ["/etc/execfile", "arg1", "arg1"]


ADD


将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget

ADD <src>... <dest>

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"


COPY


功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源


CMD


构建容器后调用,也就是在容器启动时才进行调用。

CMD command param1 param2 (执行 shell 内部命令)

CMD echo "This is a test." | wc -


#CMD 不同于 RUN,CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令


ENTRYPOINT


配置容器,使其可执行化。配合 CMD 可省去"application",只使用参数。

ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)

ENTRYPOINT command param1 param2 (shell 内部命令)FROM ubuntu

ENTRYPOINT ["top", "-b"]


CMD ["-c"]


LABEL


用于为镜像添加元数据

LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL version="1.0" description="一条 coding" by="一条"


ENV


设置环境变量

ENV <key> <value>

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Docker从入门到干事,看这一篇就够了_Java_爱好编程进阶_InfoQ写作社区