Docker常用指令
镜像操作
下载 CentOS 镜像
如果没有本地的镜像文件,则可以直接下载,下载的时候也是分层下载。
docker pull centos:7
查看centos7镜像
docker images
//可以看到name 以及id 后续操作可以通过name 或者id 进行 一般id 需要前三位及以上
或
该命令中image 没有带 s
docker image ls
运行 centos7
docker run -it xxx(centos:7) bash
- xxxx - 镜像名, 或 image id 的前几位
-it
这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。bash
放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
删除镜像
501
代表镜像 id 前几位,一般三位以上,足够区分即可
docker image rm 501
- 删除指定仓库的镜像
docker image rm centos
镜像导出
docker save mysql:5.7 node:8 | gzip > app.tar.gz
镜像导入
如果已经上传了镜像文件,则可以无需下载 ,直接导入即可
注意 < 可以换成 -i
docker load < apps.tar.gz
容器操作
启动容器
docker run -it centos:7 bash
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
后台运行
docker run -dit centos:7
-d
后台运行容器- 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。
-d
在后台运行启动 bash,如果不加交互终端(-it),bash会立即退出,容器也会自动关闭
查看后台运行的容器输出结果
docker ps # 查看正在运行的容器
docker container logs 802 # 802 指的是当前运行的容器的id
查看容器
docker container ls -a
# 或
docker ps -a
-a
all, 全部 不管是否正在运行 都可以查看
终止容器
docker container stop 802
重新启动容器
docker container restart 802
进入容器
在使用 -d 参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,可以使用 docker exec
命令
docker exec -it 802 bash
删除容器
docker container rm 802
- 如果删除运行中的容器,需要添加
-f
参数
docker container rm -f 802
删除多个容器
用 空格隔开容器的名称
docker rm xxx xxx xxx tomcat1 tomcat2
清理所有终止状态容器
docker container prune
数据管理
在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录 (Bind mounts)
数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
创建数据卷
docker volume create my-vol
查看所有数据卷
docker volume ls
查看指定 数据卷 的信息
docker volume inspect my-vol
查询的结果:
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
启动挂载数据卷的容器
docker run -it --mount source=my-vol,target=/opt/app centos:7 bash
# 或者:
docker run -it -v my-vol:/opt/app centos:7 bash
12345
-v my-vol:/opt/app
把数据卷 my-vol 挂载到容器的 /opt/app 目录
删除数据卷
- 删除指定的数据卷,如果数据卷被容器使用则无法删除
docker volume rm my-vol
- 清理无主数据卷
docker volume prune
挂载主机目录
docker run -it --mount type=bind,source=/usr/app,target=/opt/app centos:7 bash
# 或
docker run -it -v /usr/app:/opt/app centos:7 bash
-v
如果本地目录不存在 Docker 会自动为你创建一个文件夹--mount
参数时如果本地目录不存在,Docker 会报错
查看挂载目录信息
docker inspect 91a
显示结果:
...
"Mounts": [
{
"Type": "bind",
"Source": "/usr/app",
"Destination": "/opt/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
网络
自动分配映射端口
一般情况下先重启启动docker 容器
systemctl restart docker
docker run -d -P tomcat
# 查看容器信息
docker container ls -a
显示结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d03480b1a781 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:32768->8080/tcp trusting_gagarin
映射指定端口
docker run -d -p 8090:8080 tomcat
8090:8080
本机端口:容器端口
映射多个端口
docker run -d
-p 5000:5000
-p 80:8080 tomcat
映射指定端口(指定网卡)
docker run -d -p 192.168.64.150:8080:8080 tomcat
自动分配映射端口(指定网卡)
docker run -d -p 192.168.64.150::8080 tomcat
查看端口配置
docker port 8af
容器互联
新建网络
docker network create -d bridge my-net
-d
driver,网络类型,默认 bridge,也可以是 overlay(Swarm mode)
列出网络
docker network ls
查看网络信息
docker inspect my-net
连接容器
docker run -it --name app1 --network my-net centos:7
新开终端执行:
docker run -it --name app2 --network my-net centos:7
在两个终端中分别执行:
ping app1
ping app2
显示如下:
[root@35569c623c4c /]# ping app1
PING app1 (172.18.0.2) 56(84) bytes of data.
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms
......
123456
- 多个容器互联,推荐使用 Docker Compose
构建镜像--Dockerfile
准备
- centos:7镜像
- jdk压缩包
jdk-8u212-linux-x64.tar.gz
- tomcat7压缩包
apache-tomcat-7.0.96.tar.gz
Dockerfile文件
#以centos7为基础,安装oracle jdk8和tomcat7
FROM centos:7
#ADD命令将压缩包传入镜像中的指定目录,并同时解压缩
ADD jdk-8u212-linux-x64.tar.gz /opt/
ADD apache-tomcat-7.0.96.tar.gz /usr/
#为了方便,把文件夹名称改得简单一点
RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
#设置环境变量
ENV JAVA_HOME=/opt/jdk1.8.0_212
CATALINA_HOME=/usr/tomcat
PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
#暴露容器的8080端口
EXPOSE 8080
#设置启动容器时自动运行tomcat
ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
准备文件夹
进入根目录
先准备文件夹,存放构建过程中使用的所有文件
Dockerfile, jdk....gz, tomcat....gz
cd ~
mkdir tomcat7
编辑文件
cat <<EOF > Dockerfile
FROM centos:7
ADD jdk-8u212-linux-x64.tar.gz /opt/
ADD apache-tomcat-7.0.96.tar.gz /usr/
RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
ENV JAVA_HOME=/opt/jdk1.8.0_212
CATALINA_HOME=/usr/tomcat
PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
EXPOSE 8080
ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
EOF
上传JDK和tomcat压缩文件
上传jdk和tomcat7两个压缩文件到 tomcat7 目录
使用 Dockerfile 构建镜像
docker build -t tomcat:7 .
- 注意末尾的点,表示构建过程中从当前目录寻找文件
启动容器
准备存储目录
- webapps目录,例如
/opt/webapps
- logs目录,例如
/var/lib/tomcat-logs
mkdir /opt/webapps
mkdir /opt/webapps/ROOT
mkdir /var/lib/tomcat-logs
# 添加欢迎页
cat <<EOF > /opt/webapps/ROOT/index.html
<h1>Hello Docker!!!</h1>
EOF
启动容器,挂载目录
docker run
-d
-p 80:8080
--name tomcat7
-v /opt/webapps:/usr/tomcat/webapps
-v /var/lib/tomcat-logs:/usr/tomcat/logs
tomcat:7
浏览器访问
效果: