初识Docker:(4)Docker基本操作
- 1 镜像操作
- 1.1 镜像名称
- 1.2 镜像操作命令
- 1.3 案例:
- docker拉取nginx镜像
- 利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
- 1.4 镜像操作总结
- 2 容器操作
- 2.1 案例
- 创建运行一个nginx容器
- 进入nginx容器,修改HTML文件内容,添加“Hello World”
- 2.2 容器操作总结
- 2.3 案例
- 创建并运行一个redis容器,并且支持数据持久化
- 进入redis容器,并执行redis-cli客户端命令,存入num=666
- 3 数据卷
- 3.1 数据卷介绍
- 3.2 常见操作
- 2.3 案例
- 创建一个数据卷,并查看数据卷在宿主机的目录位置
- 3.3 数据卷总结
- 3.4 挂载数据卷
- 案例:创建一个nginx容器,修改容器内的html目录内的index.html内容
- 3.5 挂载宿主机目录
- 案例:创建并运行一个mysql容器,将宿主机目录直接挂载到容器
- 3.6 数据卷挂载方式对比
1 镜像操作
1.1 镜像名称
- 镜像名称一般分两部分组成:
[repository]:[tag]
- 在没有指定tags时,默认是latest,代表最新版本的镜像
1.2 镜像操作命令
1.3 案例:
docker拉取nginx镜像
Debian Docker安装:
https://www.runoob.com/docker/debian-docker-install.html
镜像拉取 && 查看
# 安装
docker pull nginx
# 查看
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23.3 1403e55ab369 3 days ago 142MB
利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
步骤一:查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23.3 1403e55ab369 3 days ago 142MB
步骤二:导出镜像
docker save -o nginx.tar nginx:1.23.3
步骤三:删除本地镜像
docker rmi nginx:1.23.3
步骤四:加载tar包到本地镜像
$ docker load -i nginx.tar
8a70d251b653: Loading layer [==================================================>] 83.97MB/83.97MB
2dadbc36c170: Loading layer [==================================================>] 62.21MB/62.21MB
2b3eec357807: Loading layer [==================================================>] 3.584kB/3.584kB
d13aea24d2cb: Loading layer [==================================================>] 4.608kB/4.608kB
9a0ef04f57f5: Loading layer [==================================================>] 3.584kB/3.584kB
c72d75f45e5b: Loading layer [==================================================>] 7.168kB/7.168kB
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23.3 1403e55ab369 3 days ago 142MB
1.4 镜像操作总结
docker imags
docker rmi
docker pull
docker push
docker save
docker load
2 容器操作
2.1 案例
创建运行一个nginx容器
# 步骤一:启动容器
$ docker run --name my-nginx-2 -p 8088:80 -d nginx:1.23.3
00c251e9260897302f46d234264764ac352bf46c22d389d4719c4004fc7b8c8f
# 步骤二:查看容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00c251e92608 nginx:1.23.3 "/docker-entrypoint.…" 49 seconds ago Up 49 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp my-nginx-2
# 步骤三:访问容器
$ curl 127.0.0.1:8088
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 步骤四:查看容器日志
$ docker logs my-nginx-2
172.17.0.1 - - [25/Dec/2022:09:26:15 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0" "-"
进入nginx容器,修改HTML文件内容,添加“Hello World”
# 步骤一:进入容器
$ docker exec -it my-nginx-2 bash
# 步骤二:进入容器相应目录
$ cd /usr/share/nginx/html/
# 步骤三:修改index.html文件内容
$ sed -i 's#Welcome to nginx#Hello World#g' index.html
# 步骤四:重新访问
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 步骤五:停止容器
$ docker stop my-nginx-2
my-nginx-2
# 步骤六:再次查看容器 需要加-a选项,默认只展示running状态的containner
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00c251e92608 nginx:1.23.3 "/docker-entrypoint.…" 21 minutes ago Exited (0) 5 seconds ago my-nginx-2
# 步骤七:删除容器 (强制删除)
$ docker rm my-nginx-2
Error response from daemon: You cannot remove a running container 00c251e9260897302f46d234264764ac352bf46c22d389d4719c4004fc7b8c8f. Stop the container before attempting removal or force remove
$ docker rm -f my-nginx-2
my-nginx-2
2.2 容器操作总结
查看容器状态:
- docker ps
- 添加-a参数查看所有状态的容器
删除容器:
- docker rm
- 不能删除运行中的容器,除非添加-f参数
进入容器:
- 命令是
docker exec -it [容器名][要执行的命令]
- exec命令可以进入容器改文件,但是在容器内修改文件是
不推荐的
2.3 案例
创建并运行一个redis容器,并且支持数据持久化
步骤一:到DockerHub搜索redis镜像
步骤二:查看Redis镜像文档中的帮助信息
步骤三:利用docker run命令运行一个Redis容器
$ docker pull redis
$ docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fac8dcb986f redis "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 6379/tcp some-redis
进入redis容器,并执行redis-cli客户端命令,存入num=666
$ docker exec -it some-redis redis-cli
127.0.0.1:6379>
127.0.0.1:6379> set num 666
OK
127.0.0.1:6379> keys *
1) "num"
3 数据卷
容器与数据耦合问题
3.1 数据卷介绍
数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录
3.2 常见操作
2.3 案例
创建一个数据卷,并查看数据卷在宿主机的目录位置
步骤一:创建数据卷
docker volume create html
步骤二:查看所有数据
docker volume ls
DRIVER VOLUME NAME
local bacea65b223501004eb67df56f02b0198d2180daaffc445493325b352fxxxxxxx
步骤三:查看数据卷详细信息
docker volume inspect html
[
{
"CreatedAt": "2022-12-25T18:20:57+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": {},
"Scope": "local"
}
]
实操
# 步骤一:查看数据卷
$ docker volume ls
DRIVER VOLUME NAME
local bacea65b223501004eb67df56f02b0198d2180daaffc445493325b352fxxxxxxx
# 步骤二:创建数据卷
$ docker volume create html
html
# 步骤三:查看是否创建成功
$ docker volume ls
DRIVER VOLUME NAME
local bacea65b223501004eb67df56f02b0198d2180daaffc445493325b352fxxxxxxx
local html
# 步骤四:查看数据卷详细信息
$ docker volume inspect html
[
{
"CreatedAt": "2022-12-25T18:20:57+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": {},
"Scope": "local"
}
]
# 步骤五:删除未使用数据卷
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
html
Total reclaimed space: 0B
# 步骤六:删除指定数据卷
docker volume rm html
3.3 数据卷总结
- 数据卷作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
- 数据卷操作
- docker volume create
- docker volume ls
- docker volume inspect
- docker volume rm
- docker volume prune
3.4 挂载数据卷
我们在创建容器时,可以通过-v
参数来挂载一个数据卷到某个容器目录
案例:创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置`/usr/share/nginx/index.html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-v参数挂载数据卷
步骤:
(1)创建容器并挂在数据卷到容器内的HTML目录
# 步骤一:创建容器并挂载数据卷
$ docker run --name my-nginx -p 80:80 -v html:/usr/share/nginx/html -d nginx:1.23.3
0d70fc44cedbb73ef32c503081f39d52243cab3f1a0dc3b04b846aae4dbfdcc0
# 步骤二:查看数据卷的具体宿主机路径
$ docker volume inspect html
[
{
"CreatedAt": "2022-12-25T20:19:52+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": null,
"Scope": "local"
}
]
(2)进入html数据卷所在位置,并修改HTML内容
# 步骤三:修改index.html文件
$ cd /var/lib/docker/volumes/html/_data
$ vim index.html # 修改文件内容,保存
# 步骤四:再次访问
$ curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>hello world!</title>
</head>
3.5 挂载宿主机目录
案例:创建并运行一个mysql容器,将宿主机目录直接挂载到容器
提示:目录挂载与数据卷挂载的语法是类似的:
- -v [宿主机目录]:[容器内目录]
- -v [宿主机文件]:[容器内文件]
实现思路如下:
- 在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像
- 创建目录/tmp/mysql/data
- 创建目录/tmp/mysql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/mysql/conf
- 去DockerHub查阅资料,创建并运行MySQL容器,要求:
a. 挂载/tmp/mysql/data到mysql容器内数据存储目录
b. 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
c. 设置MySQL密码
# 步骤一:拉取mysql镜像
$ docker pull mysql:5.7.40
# 步骤二:准备conf脚本
vim hmy.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
# 步骤三:启动mysql容器
$ docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.40
# 步骤四:连接mysql
$ mysql -uroot -P 3306 -h 127.0.0.1 -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.40 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>quit
# 步骤五:进入container查看配置文件是否与挂载文件一致
$ docker exec -it mysql bash
$ cat /etc/mysql/conf.d/hmy.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
3.6 数据卷挂载方式对比
-
docker run的命令中通过-v参数挂载文件或目录到容器中:
(1)-v [volume名称]:[容器内目录]
(2)-v [宿主机文件]: [容器内文件]
(3)-v [宿主机目录]: [容器内目录]
-
数据卷挂载与目录直接挂载的
(1)数据卷挂载耦合度低,由dicjer来管理目录,但是目录比较深,不好找
(2)目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看