最近项目需要用到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
注意:类似以下的报错,含义为“权限拒绝”。需要提权为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"。
显示结果如下:
输出完成后这个容器就会退出,但依然被占用。用以下指令可以查看当前活动中的容器:
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
是不是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
Comments NOTHING