Docker containers wrap a piece of software in a complete filesystem that contains everything needed to run: code, runtime, system tools, system libraries – anything that can be installed on a server. This guarantees that the software will always run the same, regardless of its environment.
Docker容器是一个完整的文件系统,这个文件系统中包含了你的软件运行所需要的全部环境,如:软件的源码、运行环境、所需的软件等。也就是说,你的软件运行所需要的环境都包含在了Docker容器中,这样的话当你把代码部署到服务器上时就不需要考虑环境问题,只要服务器安装了Docker就能准确无误地运行你的软件。
镜像可以理解为一组指令的集合。这些指令确定你的软件运行所需要的环境,如确你需要什么操作系统、需要安装什么软件、需要执行什么命令。
当我们做完一个镜像后可以把它通过git的方式管理起来。
镜像仓库用于存储同一镜像的不同版本。
容器是镜像的运行实例,从使用者角度看它是一个完整的Linux系统。
Registry用于存储镜像仓库。Registry分为两种类型,一种是Docker官方提供的Registry,称为Docker Hub,它和Github一样,我们可以注册账号,并存储自己的镜像,也可以使用别人的镜像;另一种是自己搭建的Registry,由于Docker Hub是一个开源项目,因此我们可以把Docker Hub部署到我们的局域网中,从而拥有私有的Registry。
该命令会显示本地所有镜像:
docker images
结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
chai/tomcat8 0.0.1 4af46f004a15 4 days ago 1.197 GB
chaimm/tomcat8 0.0.1 4af46f004a15 4 days ago 1.197 GB
ubuntu latest f8d79ba03c00 8 days ago 126.4 MB
centos latest 970633036444 3 weeks ago 196.7 MB
REPOSITORY:镜像仓库的名字
TAG:该镜像的版本号
IMAGE ID:镜像的ID
CREATED:创建时间
SIZE:镜像的大小
该命令会基于指定镜像创建一个新的容器:
docker run --name 容器名 -i -t 镜像名 /bin/bash
–name:为容器设置一个名字
-i -t:使得容器启动后能获取该容器的shell
镜像名:指定容器要基于哪一个镜像运行
最后一个参数是运行时需要需要执行的命令,这里执行/bin/bash使得容器运行后启动一个bash供我们和容器交互。
启动后结果如下:
[root@20fcdc5cdc57 local]#
启动后我们将进入容器内部,获得一个用于和容器交互的shell,我们可以在这里对容器作任何操作,并且和操作一台Linux系统没有任何区别。
docker run --name 容器名 -d 镜像名
上述命令将-i -t和/bin/bash换成了-d,从而可以使容器在后台运行,无交互式shell。
该命令执行后仅返回一个容器ID。
docker ps -a
-a:能查看所有已经被创建的容器;不加这个参数仅会显示正在运行的容器。
执行结果如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20fcdc5cdc57 chai/tomcat8:0.0.1 "/bin/bash" 4 days ago Exited (0) 6 minutes ago tomcat8
d89068a849bd centos "/bin/bash" 4 days ago Exited (0) 4 days ago high_ride
CONTAINER ID:该容器的ID
IMAGE:该容器使用的镜像
COMMAND:启动时执行的命令
CREATED:容器创建时间
STATUS:当前运行状态
PORTS:该容器所开启的端口号
NAMES:容器的名字
docker start 容器名
该命令执行后容器会在后台运行,只返回一个容器ID,若需要获取容器交互式shell,需要继续执行如下命令:
docker attach 容器名
要在容器内执行命令有两种情况:
情况一:如果你已经进入容器内部,并获取了容器的shell,那么就执行执行命令即可;
情况二:如果容器在后台运行,那么你可以通过docker exec命令直接在宿主机上执行某个容器的命令,该命令的用法如下:
docker exec [参数] 容器名 命令
上述命令会在指定的容器中执行指定的命令。
如果你的命令无需交互,那么需要在参数部分加上-d,使得该命令在容器后台执行即可;
如果你的命令在执行过程中需要用户输入,那么需要在参数部分加上-i -t,并使用命令:/bin/bash,从而你就能进入容器内部,获取一个交互式的shell。
当你在容器内部,只要执行exit命令即可停止并退出容器。
当容器处于后台运行的状态,你需要通过如下命令停止容器:
docker stop 容器名
docker inspect 容器名
上述指令可以查看指定容器的所有配置信息,这些信息以JSON的形式返回,如下:
[
{
"Id": "20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b",
"Created": "2016-08-15T13:45:50.99616017Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2016-08-20T02:50:13.565344395Z",
"FinishedAt": "2016-08-20T02:51:31.574303352Z"
},
"Image": "sha256:4af46f004a1542f94b6a4178d1af7eaa896e45bcfaf1fd1955a6c08a36670c0d",
"ResolvConfPath": "/var/lib/docker/containers/20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b/hostname",
"HostsPath": "/var/lib/docker/containers/20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b/hosts",
"LogPath": "/var/lib/docker/containers/20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b/20fcdc5cdc577460fb58bfe76eff743f176cfabbcbf4942401dc7aa35031a56b-json.log",
"Name": "/tomcat8",
"RestartCount": 0,
"Driver": "aufs",
……………………
如果你只需要查看其中某个信息,可以使用-f或–format参数指定:
docker inspect --format='{
{.NetworkSettings.IPAddress}}' 容器名
docker rm 容器名