Docker(下)

260 阅读9分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

Docker常用命令

image.png

镜像相关命令

查看镜像

查看本地所有镜像

docker images

image.png

这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

搜索镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索;注意,必须确保当前系统能联网

docker search 镜像名称

拉取镜像

拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。

docker pull 镜像名称

例如,我要下载centos7镜像

docker pull centos:7

删除镜像

按镜像ID删除镜像

docker rmi 镜像ID

删除所有镜像

删除之前要确认此镜像已经没有被容器在使用,如果存在正在运行的docker容器,删除会报错“Error: container_delete: Impossible to remove a running container, please stop it fifirst”

docker images -q #查看所有镜像的ID
docker rmi `docker images -q` #批量删除镜像

容器相关命令

查看容器

查看正在运行的容器

docker ps

查看所有容器(查看正在运行的和已经停止运行的)

docker ps –a
docker ps -all

查看最后一次运行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

创建与启动容器

创建容器命令:

docker run 参数 镜像名称:镜像标签 /bin/bash

创建容器常用的参数说明:

-i
表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动。

-t
表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加it两个参数,创建后就会自动进去容器)。

-d
在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。

--name
为创建的容器命名。

-v
表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-p
表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射,例如:可以将Docker中Tomcat容器的8080端口映射到宿主机上的某一个端口8080,那么以后访问tomcat只需要:http://宿主机的IP:8080/

进入容器之后,初始化执行的命令:/bin/bash;可写可不写

交互式容器

使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭

只有第一次才会这样,以后再启动容器就是一个守护式的。

docker run -it --name=容器名称 镜像名称:标签 /bin/bash

这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

image.png

退出当前容器

exit

守护式容器

docker run -di --name=容器名称 镜像名称(或镜像ID):标签 /bin/bash

登录容器/进入容器的目录

docker exec -it 容器名称 (或者容器ID) /bin/bash

注意:这里的登陆容器之后执行的脚本/bin/bash必须写

停止与启动容器

停止容器:

docker stop 容器名称(或者容器ID)

启动容器:

docker start 容器名称(或者容器ID)

文件拷贝

如果我们需要将宿主机的文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录 容器名称:容器目录

#新建一个空文件
touch xxx.html
#拷贝到tomcat容器的webapps目录下
docker cp xxx.html 59b35c0bbe6d:/usr/local/tomcat/webapps
#切换到tomcat容器中查看
docker exec -it tomcat容器ID /bin/bash

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录

#将copy到tomcat容器的文件再copy出来
docker cp 59b35c0bbe6d:/usr/local/tomcat/webapps/xxx.html ./

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器 添加-v参数 后边为 宿主机目录:容器目录 例如:

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器ID)

也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

删除容器

删除指定的容器,正在运行的容器无法删除

#删除容器
docker rm 容器名称(容器ID)
#删除镜像
docker rmi 镜像ID(镜像名称)

Docker数据卷(Volumes)

数据卷概述

数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。

一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

简单来说数据卷本质其实是共享文件夹,是宿主机与容器间数据共享的桥梁。

数据卷作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

数据卷配置方式

1个容器挂载1个数据卷

创建启动容器时,使用–v参数设置数据卷

docker run ... –v 宿主机目录(文件):容器内目录(文件) ...

注意事项:

  1. 目录必须是绝对路径
  2. 如果宿主机目录不存在,会自动创建
  3. 可以挂载多个数据卷

案例:

#拉取centos镜像
docker pull centos:7
#安装启动容器并挂载
docker run -di --name=c1 -v /root/host_data1:/root/c1_data centos:7 /bin/bash

image.png

查看容器已挂载的数据卷

我们可以通过以下命令,查看容器中挂载的数据卷

docker inspect 容器名称(容器ID)

1个容器挂载多个数据卷

我们可以通过以下命令,挂载多个数据卷

docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7 /bin/bash

多个容器挂载1个数据卷

多个容器挂载1个数据卷,实现数据共享

docker run -di --name=c2 -v /root/host_data_common:/root/c2_data centos:7
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7

image.png

多个容器挂载1个容器(这个容器挂载1个数据卷)

##创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7 /bin/bash
##创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run -di --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -di --name=c2 --volumes-from c3 centos:7 /bin/bash

image.png

在Docker中部署软件

MySQL部署

  1. 搜索mysql镜像
docker search mysql
  1. 拉取mysql镜像
docker pull mysql:5.7
  1. 创建容器,设置端口映射、目录映射
docker run -di --name=mysql -p 3307:3306 -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

参数说明:

  • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
  • -v /root/mysql/logs:/logs:将主机目录(/root/mysql)下的 logs 目录挂载到容器中的/logs。日志目录
  • -v /root/mysql/data:/var/lib/mysql :将宿主机目录(/root/mysql)下的data目录挂载到容器的 /var/lib/mysql 。数据目录
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码。
  1. 进入容器,操作mysql
docker exec –it c_mysql /bin/bash
  1. 使用Navicat连接容器中的mysql

Tomcat部署

  1. 搜索tomcat镜像
docker search tomcat
  1. 拉取tomcat镜像
docker pull tomcat:8-jdk8
  1. 创建容器,设置端口映射、目录映射
docker run -di --name=c_tomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8-jdk8

参数说明:

  • -p 8080:8080:将容器的8080端口映射到主机的8080端口
  • -v /root/tomcat/webapps:/usr/local/tomcat/webapps:将主机目录(/root/tomcat/webapps)挂载到容器的webapps
  1. 向Tomcat中部署服务,使用FinalShell文件上传

  2. 使用外部机器访问Tomcat,测试部署服务

Nginx部署

  1. 搜索Nginx镜像
docker search Nginx
  1. 拉取Nginx镜像
docker run -di --name=mynginx -p 80:80 nginx

Redis部署

  1. 搜索redis镜像
docker search redis
  1. 拉取redis镜像
docker pull redis
  1. 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis
  1. 使用外部机器连接redis,测试

迁移与备份

开发环境Docker,在Docker中安装很多的容器,进行对应的配置,将Docker中的运行的容器持久化为镜像,将对应的镜像安装到生产环境中。
1.将开发环境下的Docker中对应的容器持久化为镜像
2.将镜像保存为一个压缩包,发送到生产环境服务器中
3.生产环境中需要将压缩包-->镜像-->容器

容器保存为镜像

我们可以通过以下命令将容器保存为镜像

docker commit {正在运行容器名称/容器ID} {镜像名称}:{镜像标签} {ImageName} : {Tag}

# 例如
docker commit xxx redis:version_xxx_1.0.0

镜像标签如果不写默认为latest

镜像备份

我们可以通过以下命令将镜像保存为tar文件

docker save -o {压缩包存放路径} {镜像名称/镜像ID}
# 举例
docker save -o redis.tar redis:version_xxx_1.0.0 #压缩包在生产环境下会还原为一个image,还原之后的name和tag
# -o :输出到的文件

镜像恢复与迁移

首先我们先删除掉c_tomcat_bak镜像 然后执行此命令进行恢复

docker load -i {备份的镜像文件}
# 举例
docker load -i redis.tar
# -i :指定导入的文件

执行后再次查看镜像,可以看到镜像已经恢复,可以再次运行测试

docker run -di --name=mytomcat -p 8081:8080 -v /root/tomcat/webapps/:/usr/local/tomcat/webapps redis:version_xxx_1.0.0