一.镜像与容器的关系
镜像
和容器
的关系,类似于面向对象程序设计中的类
和实例
一样,镜像
是静态的定义,而容器
是镜像运行时的实体,可以看成是一个具备某个运行环境的非常轻量的虚拟机。容器
可以被创建、启动、停止和删除等。在创建容器时,需要**显示地为容器指定镜像。**指定镜像之后,容器就具备了镜像中保存的运行环境了。
例如,可以为容器指定Ubuntu14.04
的镜像,然后该容器就具备Ubuntu14.04
的运行环境了。
二.Docker使用的基本过程
容器需要基于一个镜像来创建和使用。因此,Docker
容器的使用一般有以下三个步骤:
获取一个镜像;
基于该镜像创建并启动一个容器;
进入该容器,执行“程序”。
- 第一步:获取镜像; 上面我们提到了“镜像”可以理解为一个打包了运行环境的文件系统。然而在安装完
Docker
服务之后,本地是没有任何镜像的,所以首先需要获取所需要的镜像。 - 第二步:创建并启动容器; 在获取到所需的镜像之后,就可以基于该镜像创建并启动一个容器,该容器就具备了镜像包含的运行环境了。同时,在创建容器时也可以设置容器的启动命令,该命令会在容器启动时执行。
- 第三步:进入容器并执行程序; 在容器成功创建并启动之后,该容器就具备了
ubuntu
的运行环境。我们可以进入该容器内部,并在其内部执行任何在ubuntu
系统上的程序了。这里的“程序”可以是“Linux
命令”、“shell
脚本”、“C++
程序”等。
三.docker的安装(这里可不参考)
RedHat/CentOS必须要6.6版本以上,或者7.x才能安装docker(因为docker必须运行在内核3.10及以上的系统中)
[root@fish ~]# cat /proc/version #查看内核版本
[root@fish ~]# yum install docker -y #安装docker
[root@fish ~]#service docker start #启动docker
[root@fish ~]#chkconfig docker on #设置开机启动docker
1.启动docker服务
systemctl start docker
2.设置开机自启服务
systemctl enable docker
3.查看版本
docker version
4.查看docker信息
docker info
5.修改配置重新更新docker
systemctl daemon-reload
6.重启docker
systemctl restart docker
四.获取镜像
在没有使用Docker
之前,如果我们要准备一个ubuntu
的运行环境,那么首先我们得安装一个ubuntu
的系统,多么麻烦,多么耗时啊!!而使用Docker
之后,只需要从Docker Hub中拉取一个ubuntu
镜像,基于该ubuntu
镜像启动一个容器,就可以在容器中做任何在ubuntu
系统中做的事情,整个过程大约2-3
分钟,而且主要的时间是用于下载镜像!是不是非常方便呢?
1.docker pull
默认情况下,使用docker pull
命令,会从官方的Docker Hub
库中将镜像拉取到本地。
docker pull [OPTIONS] <仓库名>:<标签>
docker pull ubuntu:14.04
2.设置镜像加速器
由于**“伟大的墙”**的原因,在国内从Docker Hub
中拉取镜像的速度可能会比较慢,国内很多云服务商都提供了镜像加速器服务,例如阿里、网易等等。
以Linux
系统配置阿里云加速器为例,只需要将下面的命令复制到Linux
的终端,以root
用户的身份执行之后,就成功的配置了阿里云加速器了!
#以root用户执行以下操作
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{#下面的URL可以替换为你自己的阿里云加速地址
"registry-mirrors": ["https://jxus37ad.mirror.aliyuncs.com "]
}
EOF
systemctl daemon-reload
systemctl restart docker
五.构建镜像
1.建立DockerFile文件
在该文件目录下,执行
2.docker build –t my_centos
输入 docker images查看镜像是否构建成功
3.删除指定镜像
docker rmi image_name/ID
六.启动一个容器
1.新建并启动
docker run
命令会基于指定的镜像创建一个容器并且启动它。docker run
的基本语法如下 :
docker run [OPTIONS] 镜像名 [COMMAND] [ARG]
docker run ubuntu:14.04 echo 'hello docker'
启动容器后,执行 echo ‘hello docker’
2.启动一个已经终止的容器
docker run
每次都会创建一个新容器,显然不符合我们的需求。这种时候,可以使用docker start
命令,使用容器名或者容器id
启动一个已经终止的容器。
docker start [OPTIONS] 容器 [容器2...]
docker start firstContainer
OPTIIONS
: 命令选项,最常用的包括**-d
后台运行容器并返回容器ID
,-i
以交互模式运行容器,-t
为容器分配一个伪输入终端,--name
指定启动容器的名称。**
但是如果想启动第一个实例创建的容器,既不知道容器的名字(因为我没有指定)而且也不知道它的id
。该怎么办呢?
3.查看容器列表信息
1.docker ps
可以查看容器的信息,包括容器ID
,基础镜像,启动命令,创建时间,当前状态,端口号,容器名字。
如果不加任何参数,只执行docker ps
,将会显示所有运行中的容器
2.docker ps –a
可以查看Docker
环境中所有的容器,包括已经停止的容器。
除了名为firstContainer
的容器外,还可以看到一个id
为ee826f1d58ff
的容器容器
3.docker start 实例id (ee826f1d58ff)
可以通过docker start ee826f1d58ff
或者docker start g\fracious_lewin
启动该容器了。
4.访问正在运行得容器实例
docker exec -it <container id | name> /bin/bash
5.删除指定容器
docker rm 1a63ddea6571
6.删除正在运行得容器
docker rm -f 1a63ddea6571
七.停止一个容器
使用docker stop停止一个容器
docker stop
可以用来终止一个正在运行的容器
docker stop [OPTIONS] Container [Container ...]
在什么情况下容器启动后会立即终止?
实际情况中,除了使用docker stop
命令来强制地终止一个容器以外,当容器的启动命令终结时,容器也自动会终止。
在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令echo 'hello docker'
会立刻执行完毕,所以容器也随之终止,因此使用docker ps -a
查看该容器的状态是终止状态。
如果容器的“启动命令”执行完之后,由于主进程没有命令继续执行,所以主进程会停止,容器也就因此而停止了。
如何才能使容器启动后不立即终止?
将启动命令设置为“启动一直运行的子进程”
docker run --name first_container -it ubuntu /bin/bash
为什么在容器中输入exit
或者执行ctrl D
后,容器将会终止呢,这是因为exit
会退出(结束)当前进程,也就是/bin/bash
,由于子进程结束,sh
主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh
主进程结,因此容器终止。
八.给docker开启远程访问
1.修改docker配置文件
[xxx@root]#vi /usr/lib/systemd/system/docker.service
修改
ExecStart=/usr/bin/dockerd
#centos设置:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
#Ubunt设置:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
保存退出,这一步是将docker映射到虚拟机2375端口