一、Docker 基本概念
Docker 中有三个基本概念:镜像(Image)
、容器(Container)
、仓库(Repository)
。
镜像和容器的关系,就像是代码文件和进程的关系,镜像是静态的文件,容器是镜像运行时的实体。
仓库就是用来保存镜像的, 类似于git
。我们可以从中心仓库下载镜像,也可以从自建仓库下载。目前 Docker 官方维护了一个中心仓库 Docker Hub
, 类似于github
。
docker中概念 | 类比的概念 |
---|---|
镜像 vs. 容器 | 代码文件 vs. 进程 |
中心仓库 vs. 自建仓库 | github vs. gitlab |
二、快速使用Docker搭建一个web服务器
1、首先要使用docker run
命令启动容器,容器内启动centos
docker run -p 8080:80 --name web-test -i -t centos /bin/bash
这条命令会使用Docker镜像centos来启动一个Docker容器。
参数说明:
-p
选项开放容器的80端口,并将容器的80端口映射到宿主机的8080端口;--name
选项指定容器的名称;-i
选项使容器以交互模式运行;-t
选项为容器重新分配一个伪输入终端,i
和-t
选项通常同时使用。centos
:docker镜像的名称,Docker会首先在本机中寻找该镜像,如果本机没有的话,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。同一个镜像可以有多个版本,用tag来区别,可以在镜像名后加:TAG
来指定镜像的版本。/bin/bash
:放在镜像名后的是在容器中执行的命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
2、在容器中安装Nginx并启动
$ yum install -y nginx
$ nginx #启动nginx
这样就可以在浏览器访问nginx页面了,地址:http://ip:8082
注意:这一步要在容器内的centos的终端里执行。
三、Docker基本命令
3.1 容器相关
docker run = docker create + docker start
docker create: 创建容器
docker start container-name: 重新启动已经创建的容器。
docker attach container-name: 切换到容器的交互模式
docker ps: 列出运行中的容器
docker ps -a : 列出所有状态的容器
docker rm container-id/container-name: 删除容器
3.2 镜像相关
docker images: 列出本地的镜像
docker search:从Docker Hub来搜索镜像
docker rmi IMAGE_NAME: 删除镜像
四、构建Docker镜像
两种创建镜像的方法:
- 在已经创建的容器内部更新镜像,然后提交这个镜像
- 使用Dockerfile创建一个新的镜像
4.1 通过更新已有镜像来创建镜像
步骤如下:
- 使用已有镜像启动一个容器
- 在运行的容器内更新内容
- docker commit 提交本地镜像
- 上传到公共仓库
具体命令如下:
# 使用镜像centos:7启动一个容器
[host]$ docker run -i -t --name new-centos centos:7 /bin/bash
# 在容器内部新建文件夹
[container]$ mkdir /home/easonsun
# centos镜像没有安装vim, 在容器中安装vim
[container]$ yum install -y vim
# 新建文件并写入内容
[container]$ vim /home/easonsun/easonsun.txt
# 退出容器
[container]$ exit
# 使用docker commit 提交镜像, 使用docker ps -a 查看容器id
[host]$ docker commit -m="download vim" -a="easonsun" container-id easonsun/centos:v1
# 查看提交的镜像
[host]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
easonsun/centos v1 01b82ef011ab 2 seconds ago 376MB
# 可以看到刚刚提交的镜像,现在可以使用这个镜像来启动容器,启动的容器内部已经下载了download, 并且存在我们刚刚写的easonsun.txt文件。
docker commit
命令选项解释:
-m
:本次提交的描述信息-a
: 指定镜像的作者container-id
: 容器id, 使用docker ps -a
查看easonsun/centos:v1
: 指定创建的镜像名和TAG.
将镜像保存到本机之后,可以push到docker hub上:
# 首先登陆docker hub账号
$ docker login # 输入docker hub用户名密码
# 将镜像push到docker hub
$ docker push image-name:tag
注意推送镜像到docker hub时,镜像名中要含有docker hub Uername/
, 否则会推送失败。例如:dockerhub的用户名是easonsun
, 那么镜像名要以easonsun/
开头。
4.2 使用Dockerfile构建镜像
可以使用docker bulid
命令从零开始构建一个新的镜像,使用docker build
命令首先需要有个Dockerfile
文件,类似于使用ma ke
命令构建可执行文件,需要有个Makefile
文件。Dockerfile文件中包含一组指令来告诉Docker怎么构建镜像。
Dockerfile的语法中有两个关键字,分别是FROM
和RUN
FROM
: 后面跟一个镜像名, 使用Dockerfile定制的镜像都是基于FROM后面的镜像,可以认为FROM
后面的是一个基础镜像,后续的RUN操作都是基于这个基础镜像做的。RUN
:用于执行后面跟着的命令行命令。每执行一个RUN指令,dock er都会在原来的镜像上新建一层镜像。所以为了减少过多无意义的层,可以使用&&
符号将多个命令行命令放在一个RUN指令中。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz