Docker学习笔记(1):Hello,World

发布于 2023-02-22  344 次阅读


最近项目需要用到docker,同时也想熟悉一下linux的操作,所以现在开始更新一个Docker的学习笔记。

服务器环境

我用的是Ubuntu 18.04的版本,(我只会用这个),这个版本网上的教程比较多。

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

安装Dcoker

推荐使用一键安装脚本进行安装:

阿里云镜像安装命令:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

daocloud镜像安装命令:

curl -sSL https://get.daocloud.io/docker | sh

输入命令后等待一段时间即可完成。

用以下命令查询docker版本来验证安装是否完成(用root用户,不用的话需要在命令前加sudo):

docker -v
查询docker版本

注意:类似以下的报错,含义为“权限拒绝”。需要提权为root或者在命令前加上“sudo”。

权限拒绝 报错

理解镜像和容器

镜像可以理解为一个静态的程序的模板,需要放入容器中运行。

容器是用于运行程序的一个环境,容器之间互不干扰,相互独立,也可以通过“容器互联”将不同的容器之间实现互联,不同的容器可以运行在不同的环境中,

镜像和容器的关系可以类比C++中类与对象的关系,对象是将类实例化的结果,而容器也是将镜像实例化的结果。

国内镜像加速

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • 科大镜像:https://docker.mirrors.ustc.edu.cn/
  • 网易:https://hub-mirror.c.163.com/
  • 阿里云:https://<你的ID>.mirror.aliyuncs.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

Ubuntu14.04、Debian7Wheezy

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

Ubuntu16.04+、Debian8+、CentOS7

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}

我这里的ubuntu版本是18.04,所以我用第二种方式。

运行第一个Hello,World程序

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

输出Hello world:

docker run ubuntu:18.04 /bin/echo "Hello, World"

在这条run命令中,没有其他附加项,默认就是前台运行、没有输入、没有终端的,命令含义为在ubuntu18.04环境中运行echo程序,给echo程序的参数是"Hello, World"。

显示结果如下:

Hello,World运行结果

输出完成后这个容器就会退出,但依然被占用。用以下指令可以查看当前活动中的容器:

docker ps

你会发现结果是空的,没有看到之前运行的容器,需要加上选项 -a 来查看所有容器。

docker ps -a

结果如下:

查询结果

最开始的Container Id表示的是容器的id,是唯一且随机的。第二个Image表示镜像,第三个Command表示执行的命令,后面的Created表示创建时间,Status表示容器的状态,图中的Exit(0)表示正常退出(返回值为0),由于该程序没有联网,所以没有Ports(端口),最后一个names是容器的别名。

小tips:容器可以用id和names来指定,id无需输入完全即可指定,而name需要输入完全,id无法改变,但name可以修改,用以下命令:

docker rename [旧名] [新名]

我用指令将刚刚创建的容器改名为"helloworld",可以发现下图的rename指令中[旧名]参数用的是6d,即id的前一段(id无需输入完全,只要能够辨别是哪一个即可,实际上这里用name也可以,不过需要输入完全,用于指定容器),而新名只能是[new name]。

容器改名

现在我们来删除这个helloworld容器,用以下指令:

docker rm helloworld
删除docker容器

是不是so easy,注意容器只有在非运行状态才能删除,如果容器在运行中需要删除需要先用以下指令停止容器运行。

docker stop [container]

用以下指令可以重新启动容器:

docker start [container]

其他的一些操作

查看所有镜像:

docker images
查看所有镜像

删除镜像:

docker rmi [image / repository]

例如我删除training/webapp这个镜像,用以下命令:

docker rmi training/webapp
删除镜像

让容器随docker启动而start,这个需要分情况,如果容器还没创建,可以在run的时候新增选项 --restart=always,这选项的含义是:

no             不自动重启容器. (默认value)
on-failure     容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always         在容器已经stop掉或Docker stoped/restarted的时候才重启容器

如果容器已经存在,可以用update指令来更新容器的状态。

docker update [container] --restart always

参考资料

Docker 镜像加速 | 菜鸟教程 (runoob.com)

Docker 容器开机启动设置-谢先斌的博客 (xiexianbin.cn)