Docker 常用命令
一、背景知识
1、Docker 概念
Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。Docker容器是完全使用沙箱机制,相互隔离,性能开销也极低。
Docker 其实就是可以打包程序和运行环境,把环境和程序一起发布的容器。
Docker通俗的讲是服务器中高性能的虚拟机,可以将一台物理机虚拟N多台虚拟机的机器,互相之间隔离,互不影响。
Docker的两句口号:
- 「Build, Ship and Run (搭建,发送,运行)」
- 「Build once,Run anywhere (搭建一次,运行到任何地方)」
2、Docker 镜像
Docker 镜像,就相当于是一个 root 文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。
Docker 镜像可以从两个地方获取:
- 从Docker Hub下载 maven-> 中央仓库
- 通过 Docker file 自己创建出来
3、Docker 容器
Docker 容器类似于一个轻量级的沙箱,Docker 利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
Docker 容器是镜像运行之后的实体,镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。
4、Docker 仓库
Docker 仓库(Repository)类似于代码仓库,是 Docker 集中存放镜像文件的场所。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 Docker Pool 等,可以提供稳定的国内访问。
二、Docker 的安装
#关闭防火墙
systemctl stop firewalld
#关闭selinux安全系统(可选择不关)
vim /etc/selinux/config
SELINUX=disabled
#安装docker引擎
yum install -y docker
#启动docker
systemctl start docker
#设置docker自启动
systemctl enable docker
#测试docker是否安装成功
docker run hello-world
三、Docker 常用命令
1、镜像命令
1.1 查看镜像 docker images
1)命令:docker images
2)作用:列出本地主机上已有的镜像
3)语法:docker images
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
4)字段名称含义:
列名 | 含义 |
---|---|
REPOSITORY | 来自于哪个仓库,比如 ubuntu 仓库 |
TAG | 镜像的标签信息,即版本,latest则代表最新版本 |
IMAGE ID | 镜像的ID(唯一),镜像的ID信息十分重要,它唯一标识了镜像 |
CREATED | 创建时间 |
SIZE | 镜像大小 |
1.2 搜索镜像 docker search
1)命令:docker search
2)作用:搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像
3)语法:docker serach 镜像名称
#列名分别代表:仓库、名称、镜像描述、用户评价、是否官方发布、自动构建
[root@localhost /]# docker search tomcat
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/tomcat Apache Tomcat is an open source implementa... 3464 [OK]
docker.io docker.io/tomee Apache TomEE is an all-Apache Java EE cert... 100 [OK]
docker.io docker.io/bitnami/tomcat Bitnami Tomcat Docker Image 47 [OK]
.......
1.3 拉取镜像 docker pull
1)命令:docker pull
2)作用:从Docker仓库下载镜像到本地,镜像名称格式为[名称:版本号],如果版本号不指定则是最新的版本
3)语法:docker pull 镜像名称[:版本号]
[root@localhost /]# docker pull centos:7
Trying to pull repository docker.io/library/centos ...
7: Pulling from docker.io/library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for docker.io/centos:7
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
docker.io/centos 7 eeb6ee3f44bd 15 months ago 204 MB
1.4 删除镜像 docker rmi
1)命令:docker rmi
2)作用:按镜像ID删除镜像
3)语法:docker rmi 镜像ID
#镜像ID可以只写前两位
[root@localhost /]# docker rmi ee
Untagged: docker.io/centos:7
Untagged: docker.io/centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
Deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
2、容器命令
2.1 查看容器 docker ps
1)命令:docker ps
2)作用:查看正在运行的容器
3)语法:docker ps [参数]
4)参数:
- -a:查看所有容器(查看正在运行的和已经停止运行的)
- -q:返回容器id号
注意:docker 命令的参数都是在 docker 后面的单词的后面,原因是 docker 命令都需要加一个 docker 前缀,例如:docker ps -a
只查看停止的容器:docker ps -f status=exited
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21d8310e2f51 hello-world "/hello" 6 hours ago Exited (0) 6 hours ago happy_colden
5)字段名称含义:
列名 | 含义 |
---|---|
CONTAINER ID | 容器ID |
IMAGE | 镜像名称:镜像标签 |
COMMAND | 命令 |
CREATED | 创建时间 |
STATUS | 运行状态及运行的时间 |
PORTS | 占用的端口情况 |
NAMES | 容器名称 |
2.2 创建容器 docker create
1)命令:docker create
2)作用:创建容器
3)语法:docker create -it 镜像名字
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
2.3 创建并启动容器 docker run
1)命令:docker run
2)作用:创建并启动容器,等价于先执行 docker create 命令,再执行 docker start 命令
3)语法:docker run 参数 镜像名称:镜像标签 /bin/bash
4)参数:
- -i:表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动
- -t:表示容器启动后会进入其命令行。加入 it 这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加 it 两个参数,创建后就会自动进去容器)
- -d:创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)
- –name:为创建的容器命名
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射,例如:可以将 Docker 中 Tomcat 容器的 8080 端口映射到宿主机上的某一个端口 8080,那么以后访问tomcat只需要:http://宿主机的IP:8080/
- 进入容器之后,初始化执行的命令:/bin/bash;可写可不写
#创建一个交互式容器
[root@localhost /]# docker run -it tomcat /bin/bash
root@27ebdbc481a6:/usr/local/tomcat# ll
total 200
......
drwxr-xr-x. 2 root root 4096 Dec 9 20:41 webapps/
drwxr-xr-x. 7 root root 4096 Dec 5 16:30 webapps.dist/
drwxrwxrwx. 2 root root 4096 Dec 5 16:30 work/
root@27ebdbc481a6:/usr/local/tomcat#
#创建一个守护式容器
[root@localhost /]# docker run -di --name=my_tomcat tomcat /bin/bash
f1b6a4019e720316b8712a8867bbe306ec4fe81975f0370846f87b7b64b57879
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b6a4019e72 tomcat "/bin/bash" 6 seconds ago Up 5 seconds 8080/tcp my_tomcat
2.4 启动容器 docker start
1)命令:docker start
2)作用:启动容器
3)语法:docker start 容器ID(或容器名称)
[root@localhost /]# docker start my_tomcat
my_tomcat
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b6a4019e72 tomcat "/bin/bash" 2 hours ago Up 4 seconds 8080/tcp my_tomcat
2.5 停止容器 docker stop
1)命令:docker stop
2)作用:终止容器
3)语法:docker stop 容器ID(或容器名称)
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b6a4019e72 tomcat "/bin/bash" 2 hours ago Up 2 hours 8080/tcp my_tomcat
[root@localhost /]# docker stop my_tomcat
my_tomcat
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2.6 进入容器 docker exec
1)命令:docker exec
2)作用:登录/进入容器
3)语法:docker exec -it 容器ID(或容器名称) /bin/bash
[root@localhost /]# docker exec -it my_tomcat /bin/bash
root@f1b6a4019e72:/usr/local/tomcat# cd webapps/
root@f1b6a4019e72:/usr/local/tomcat/webapps# ll
total 12
drwxr-xr-x. 2 root root 4096 Dec 9 20:41 ./
drwxr-xr-x. 1 root root 4096 Dec 9 20:41 ../
root@f1b6a4019e72:/usr/local/tomcat/webapps#
2.7 查看容器IP docker inspect
1)命令:docker create
2)作用:创建容器
3)语法:docker inspect -it 容器ID(或容器名称)
[root@localhost /]# docker inspect my_tomcat
......
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "85f6bcd434fbf62f1c2e9c4b9aa4215e7e6829e60fa39b8163be10ad65d25393",
"EndpointID": "5444ae2d6343c9fbaef7ca8f7667c172b490fde2a30f7803515b6361b21dbd69",
"Gateway": "172.17.0.1", #网关
"IPAddress": "172.17.0.2", #IP地址
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02" #MAC地址
}
}
也可以用以下命令直接输出 IP 地址:
docker inspect --format=‘{{.NetworkSettings.IPAddress}}’ 容器ID(或容器名称)
2.8 删除容器 docker rm
1)命令:docker rm
2)作用:删除容器
3)语法:docker rm 容器ID(或容器名称)
4)参数:
- -f:–force=false强行终止并删除一个运行中的容器
- -l:–link=false删除容器的连接,但保留容器
- -V:–volumes=false删除容器挂载的数据卷
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b6a4019e72 tomcat "/bin/bash" 2 hours ago Up 18 minutes 8080/tcp my_tomcat
#直接删除报错,需要先停止容器,再删除
[root@localhost /]# docker rm my_tomcat
Error response from daemon: You cannot remove a running container f1b6a4019e720316b8712a8867bbe306ec4fe81975f0370846f87b7b64b57879. Stop the container before attempting removal or use -f
[root@localhost /]# docker rm -f my_tomcat
my_tomcat
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e93829a4f7c5 tomcat "/bin/sh" 2 hours ago Exited (0) 2 hours ago epic_sinoussi
21d8310e2f51 hello-world "/hello" 3 days ago Exited (0) 3 days ago happy_colden
3、其他命令
3.1 查看日志 docker logs
1)命令:docker logs
2)作用:查看日志
3)语法:docker logs 容器ID(或容器名称)
3.2 查看容器中进程 docker top
1)命令:docker top
2)作用:查看容器中进程
3)语法:docker top 容器ID(或容器名称)
3.3 文件拷贝 docker cp
1)命令:docker cp
2)作用:文件拷贝
3)语法:
将宿主机的文件拷贝到容器内:docker cp 需要拷贝的文件或目录 容器名称:容器内目录
将文件从容器内拷贝出来:docker cp 容器名称:容器内路径 目录路径
#新建一个空文件
touch hello.html
#拷贝到tomcat容器的webapps目录下
docker cp tomcat.html my_tomcat:/usr/local/tomcat/webapps
#切换到tomcat容器中查看
docker exec -it my_tomcat /bin/bash
#将copy到tomcat容器的文件再copy出来
docker cp my_tomcat:/usr/local/tomcat/webapps/hello.html ./
四、实战部署
1、Java 环境部署
1)查看 JDK 镜像:可在docker.hub上面查,也可使用docker search
docker search openjdk
2)拉取 JDK 镜像
docker pull openjdk:8
3)创建 JDK 镜像
docker run -di openjdk:8
4)进入容器验证
docker exec -it 容器ID /bin/bash
java -version
2、MySQL部署
1)搜索 mysql 镜像
docker search mysql
2)拉取 mysql 镜像
docker pull mysql:5.7
3)创建容器
docker run -di --name=mysql -p 3600:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
4)进入容器验证
docker exec -it mysql /bin/bash
mysql -uroot -p123456
5)可以使用 MySQL 可视化工具 Navicat 或者 SQLyog 登录,注意,端口号为映射的宿主机端口号,即3600
3、Tomcat部署
1)搜索 tomcat 镜像
docker search tomcat
2)拉取 tomcat 镜像
docker pull tomcat:8.5
3)创建容器
docker run -di --name my_tomcat -p 9000:8080 tomcat:8.5 /bin/bash
4)进入容器
docker exec -it my_tomcat /bin/bash