开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
3 常用命令
3.1 镜像相关命令
3.1.1 查看镜像
docker images
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
3.1.2 搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
3.1.3 拉取镜像
拉取镜像就是从中央仓库中下载镜像到本地
docker pull 注册中心地址/镜像仓库名称:镜像版本
# 去默认注册中心下载
docker pull 镜像仓库名称:镜像版本
# 去默认注册中心下载 下载标签为latest的镜像
docker pull 镜像仓库名称
docker pull 镜像名称 # 如果后面没有加 tag,默认是下载latest版本, 指定版本:tag
例如,我要下载centos7镜像
docker pull centos:7
3.1.4 删除镜像
按镜像ID删除镜像
docker rmi 镜像ID(或镜像名:tag)
删除所有镜像, 谨慎使用
docker rmi `docker images -q`
3.2 容器相关命令
3.2.1 查看容器
查看正在运行的容器
docker ps
查看所有容器
docker ps –a
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
3.2.2 创建与启动容器
创建容器常用的参数说明:
创建容器命令:docker run 创建并运行
docker run [选项] 镜像id 或 镜像名称:版本号 [命令]
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名, 必须是唯一的。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
(1)交互式方式创建容器
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态
退出当前容器
exit
(2)守护式方式创建容器:
docker run -di --name 容器名称 镜像名称:标签
#如:docker run -di --name=mynginx -p 80:80 nginx
登录守护式容器方式:
docker exec -it 容器名称 (或者容器ID) /bin/bash
3.2.3 停止与启动容器
停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)
docker restart 容器名称(或者容器ID)
3.2.4 文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
3.2.5 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
# --privileged=true 代表的是多级文件夹下的权限访问问题
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
3.2.6 查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID)
也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
创建一个运行nginx的容器
1. 搜索nginx镜像
2. 拉取nginx镜像
3. 创建并运行容器
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
docker run -id --name my-nginx -p 80:80 nginx
查看my-nginx的ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx
3.2.7 删除容器
删除指定的容器:
docker rm 容器名称(或容器ID)
3.2.8 查看日志
查看容器运行日志
docker logs -f 容器名称(或容器ID)
3.3 数据卷管理
3.3.1 数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,一般是在宿主机的某个特定的目录下。可以提供很多有用的特性:
数据卷可以在容器之间共享和重用- 对
数据卷的修改会立马在挂载数据卷的容器中可见 - 对
数据卷的更新,不会影响镜像 数据卷默认会一直存在,即使容器被删除
通过docker volume命令可以管理数据卷,语法包括:
[root@localhost ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Options:
--help Print usage
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused volumes
rm Remove one or more volumes
说明:docker volume COMMAND
-
COMMAND:要运行的数据卷指令
- create:创建一个数据卷
- inspect:显示一个或多个指定数据卷的详细信息
- ls:查看所有的数据卷
- prune:删除所有未使用的数据卷
- rm:删除一个或多个指定的数据卷
通过docker volume create来实现,示例:
# 创建一个名为html的数据卷
docker volume create html
通过docker volume ls查看所有的数据卷:
3.3.2 挂载数据卷
只有在创建容器时才可以挂载数据卷。
创建一个容器,并挂载刚刚指定的数据卷:
docker run -id --name=my-nginx -p 8888:80 -v html:/usr/share/nginx/html nginx
然后,通过命令查看数据卷html在宿主机的物理地址:
docker volume inspect html
结果:
[ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/html/_data", "Name": "html", "Options": {}, "Scope": "local" }]
进入该目录查看:
cd /var/lib/docker/volumes/html/_data
修改这个index.html文件:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>一样的教育,不一样的品质</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>欢迎来学习!</h1>
<p>欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎欢迎.</p>
<p>查看信息:
<a href="http://www.itcast.cn">欢迎</a>.<br/></p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
再次访问你的虚拟机地址:http://youIp
注意:如果在运行容器时指定了数据卷,而数据卷不存在,docker会自动创建一个数据卷。
3.3.3 挂载本地文件或文件夹
除了挂载数据卷以外,docker也允许你挂载一个指定的本地目录或者本地文件。比如我希望在运行nginx的同时挂载一个本地的nginx配置文件,方便以后修改nginx配置。
首先,我们在宿主机的任意目录,创建一个文件:nginx.conf,
# 创建nginx.conf文件
touch nginx.conf
# 编辑nginx.conf文件
vi nginx.conf
内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
default_type text/html; # 默认响应类型是html
server {
listen 80;
location /s {
# 以/s开头的路径,会代理到百度
proxy_pass https://www.baidu.com;
}
location / {
root /usr/share/nginx/html;
}
}
}
然后,我们删除之前的nginx容器:
docker rm my-nginx -f
创建一个新的容器:
docker run --name my-nginx -p 8888:80 -v html:/usr/share/nginx/html -v $PWD/nginx.conf:/etc/nginx/nginx.conf --privileged=true -id nginx
命令说明:
-
--name my-nginx:容器名称为my-nginx -
-p 80:80:将容器的80端口映射到宿主机的80端口 -
-v html:/usr/share/nginx/html:挂载html数据卷到容器的/usr/share/nginx/html目录 -
-v $PWD/nginx.conf:/etc/nginx/nginx.conf:$PWD/nginx.conf:当前目录下的nginx.conf文件- 把宿主机当前目录下的
nginx.conf文件挂载到容器内的/etc/nginx/nginx.conf文件
-
--privileged:授予本地目录的访问权限 -
-d:后台运行 -
nginx:镜像名称
然后,在浏览器访问:http://youIp/s,例如我的:http://161.189.111.227:8888/s:
3.4 网络管理
当我们要部署基于docker的微服务群时,往往会需要容器之间互相连接。这时就需要用到Docker中的网络配置了。
通过docker network命令可以管理docker网络。
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Options:
--help Print usage
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
说明:
- connect:把一个容器连接到指定的network
- create:创建一个network
- disconnect:将一个容器从指定的network断开
- inspect:显示某个network的详细信息
- ls:列出所有的network
- prune:删除未使用的network
- rm:删除指定的一个或多个network
3.4.1 创建network
通过docker network create命令来创建,示例:
docker network create -d bridge my-net
说明:
-d:指定网络类型,可以是:bridge、overlay,默认是bridge
关于网络模式参考:
3.4.2 查看network
通过docker network ls查看network,示例:
可以看到,除了我们刚刚创建的my-net外,还有几个默认的网络。
另外,还可以通过命令查看具体信息:
docker network inspect my-net
结果:
[
{
"Name": "my-net",
"Id": "bf3efa08d055d38c44cabee47bbd45145dd69d7d6609028e9b9905cf0f17f7a7",
"Created": "2020-07-07T16:11:48.193977107+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
3.4.3 连接network
可以将一个已经运行的容器连接到某个network:
docker network connect my-net my-nginx
也可以在创建容器时,连接一个network:
docker run -it --rm --name mycentos --network=my-net centos:7 /bin/bash
说明:
-it:运行容器并保持一个可交互的shell终端--rm:容器退出时,自动删除容器--network my-net:连接到my-net网络
运行后会自动进入容器,并开启一个shell终端,为了测试网络,我们可以执行命令:
ping my-nginx
用容器名去测试连接:
3.5 迁移与备份
3.5.1 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
docker commit my-nginx mynginx_i
# my-nginx 容器名称, mynginx_i 自定义镜像名称
3.5.2 镜像备份
我们可以通过以下命令将镜像保存为tar 文件
docker save -o mynginx.tar mynginx_i
3.5.3 镜像恢复与迁移
首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
4 应用部署
4.1 MySQL部署
(1)拉取mysql镜像
docker pull mysql:5.7
(2)创建容器
docker run -id -p 3306:3306 --name=ly_mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登陆密码
(3)远程登录mysql
连接宿主机的IP ,指定端口为3306
如果出现异常:IPv4 forwarding is disabled. Networking will not work
解决方案:
vi /etc/sysctl.conf net.ipv4.ip_forward=1 #最下方添加这段代码 #重启network服务 systemctl restart network && systemctl restart docker #查看是否修改成功 (备注:返回1,就是成功) [root@docker-node2 ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
4.2 tomcat部署
(1)拉取镜像
docker pull tomcat:7-jre7
(2)创建容器
创建容器 -p表示地址映射
docker run -di --name=mytomcat -p 9000:8080 \
-v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
4.3 RabbitMQ部署
(1)拉取RabbitMQ镜像
docker pull rabbitmq:3-management
如果网络较慢使用资料中提供好的镜像资料mq.tar并导入
导入命令:docker load -i mq.tar
(2)运行MQ容器
docker run \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-id \
rabbitmq:management
(3)浏览器测试访问http://192.168.200.150:15672/
4.4 Redis部署
(1)拉取镜像
docker pull redis
(2)创建容器
docker run -di --name=myredis -p 6379:6379 redis