镜像
查看镜像
# 查看本地镜像
$ docker images
查找仓库/拉取/推送镜像
# 查找仓库里的镜像(指定版本)
$ docker search centos:12.03
# 获取镜像到本地
$ docker pull centos
# 推送镜像到远程仓库
$ docker push centos
删除镜像
# 删除镜像
$ docker rmi [IMAGE ID]
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
-
1、【更新镜像】从已经创建的容器中更新镜像,并且提交这个镜像
$ docker commit -m="描述信息" -a="作者名" [容器名/id] runoob/ubuntu:v2 各个参数说明: -m: 提交的描述信息 -a: 指定镜像作者 e218edb10161:容器 ID runoob/ubuntu:v2: 指定要创建的目标镜像名
-
2、【构建镜像】使用 Dockerfile 指令来创建一个新的镜像(Dockerfile写法见下一节讲解)
$ docker build -t runoob/centos:6.7 . 各个参数说明: -t :指定要创建的目标镜像名 . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
虚悬镜像
虚悬镜像(dangling image)是指在Docker中存在的一种特殊状态的镜像。它已经被创建,但是没有被任何容器所引用,也不会被Docker清理工具删除。一般镜像的REPOSITORY
和TAG
都为None。
查看虚灵镜像:
$ docker images -a
删除虚灵镜像:
$ docker images prune --filter "dangling=true"
注意:docker image prune
命令会删除所有未被使用的镜像,包括虚悬镜像和正常的镜像,所以请谨慎使用该命令。一定加上参数"dangling=true"
。
容器
查看容器
# 查看启动的容器实例
$ docker ps -a
-a : 列出当前所有正在运行的容器 + 历史上运行过的
-l : 显示最近创建的容器
-n : 显示最近n个创建的容器
-q : 静默模式,只显示容器编号
########## 容器的7种状态 ##########
created(已创建)
restarting(重启中)
running 或 Up(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
启动容器
# 启动交互式运行,并进入bash窗口
$ docker run -it -h mycentos --name=mycentos centos /bin/bash
参数说明:
--name=mycentos
设定容器的名字
-h HOSTNAME 或者 --hostname=HOSTNAME:
设定容器的主机名(mycentos),它会被写到容器内的 /etc/hostname 和 /etc/hosts。
--dns=IP_ADDRESS:
添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
# 后台运行容器,仅加“-d”
$ docker run -itd --name=mycentos centos /bin/bash
# 启动已经停止的容器
$ docker start [容器名/id]
进入容器
# 进入后台运行的容器
$ docker attach [容器名/id]
注意: 如果从这个容器退出,会导致容器的停止。
$ docker exec -it [容器名/id] /bin/bash
注意: 如果从这个容器退出,容器不会停止【推荐】
重启/停止/删除容器
# 重启容器
$ docker start [容器名/id]
# 停止的容器,通过 docker restart 重启
$ docker restart [容器名/id]
# 停止容器
$ docker stop [容器名/id]
# 删除【删除前,需要先停止容器】
$ docker rm [容器名/id]
# 强制删除容器【不建议】
$ docker rm -f [容器名/id]
# 清理掉所有处于终止状态的容器
$ docker container prune
退出容器
# 退出容器实例
【方式1】 run进去容器后,exit容器,容器停止
【方式2】 run进去容器后,ctrl+p+q,容器不停止
查看容器日志
# 查看容器的标准输出
$ docker logs [容器名/id]
# 查看即时日志, CTRL+C 退出
$ docker logs -f [容器名/id]
导入/导出容器
# 导出容器
$ docker export [容器名/id] > centos.tar
# 导入容器快照
$ cat ./centos.tar | docker import - test/centos:v1
# 或者通过指定URL 或者某个目录来导入
$ docker import http://example.com/exampleimage.tgz example/imagerepo
运行一个 web 应用
$ docker pull training/webapp # 载入镜像
$ docker run -d -p 5000:5000 training/webapp python app.py
各个参数:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口随机映射到我们使用的主机上
-p:指定端口(本地端口:容器端口)
# 指定ip地址和UDP协议(默认为TCP协议)
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
# 快捷方式查看容器的端口映射
$ docker port [容器名/id]
查看web应用 程序容器的进程
$ docker top [容器名/id]
查看详细应用程序
docker inspect [容器名/id]
容器连接 (第一种方式)
# 第一步:新建网络 (test-net)
$ docker network create -d bridge test-net
参数说明:
-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
# 第二步:创建两个容器,连接到新建的同一网络
$ docker run -d --name text01 --network test-net ubuntu /bin/bash
$ docker run -d --name text02 --network test-net ubuntu /bin/bash
# 第三步:进入到每一个容器后,安装ping命令后,如果彼此可以ping通,说明容器已连接
仓库
登录和退出
# 登陆
$ docker login
# 退出
$ docker logout
更改镜像标签
# username 请替换为你的 Docker 账号用户名
$ docker tag ubuntu:18.04 username/ubuntu:18.04
本地镜像发布阿里云
第一步:登陆阿里云控制台,选择“容器镜像服务ACR”
第二步:先创建命名空间,再创建镜像仓库名称(可以公开)
第三步:根据提供命令,进行登陆发布
- 登录阿里云Docker Registry
$ docker login --username=[阿里账号] registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时,设置的密码
(注意:您可以在访问凭证页面修改凭证密码)。
- 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/voll/woerzx:[镜像版本号]
- 将镜像推送到Registry
$ docker login --username=[阿里账号] registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/voll/woerzx:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/voll/woerzx:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
- 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
- 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 “docker push” 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
搭建私有仓库 Registry
在自己的服务搭建属于本公司的自己私有镜像仓库 Registry
# 第一步:查找私有仓库安装包 Registry ,选择官方版本拉取
$ docker search registry
# 第二步:拉取私有仓库
$ docker pull registry
# 第三步:指定端口,来创建私有仓库容器(下一节:容器数据卷重点讲解该命令)
$ docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true
registry
仅加参数“-v”默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调。
# 第四步:查看新创建的私服仓库里,包含哪些内容,使用curl模拟发送get请求访问。通过ifconfig查看docker的网卡ip
$ curl -XGET http://172.17.0.1:5000/v2/_catalog
# {"repositories":[" "]} 无镜像
# 第五步:tag出符合新私服库的新的镜像
$ docker tag ubuntu:latest 172.17.0.1:5000/ubuntu:v1.0
# 第六步:推送到创建的私服仓库里(操作前解除http权限限制,默认支持https)
$ vi /etc/docker/daemon.json
{
"insecure-registries" : [ "172.17.0.1:5000" ]
}
$ systemctl restart docker #重启docker
$ docker start [registry/id] #重启registry
$ docker push 172.17.0.1:5000/ubuntu:v1.0 # 开始推送
# 第七步: 重复第四步,检查验证是否推送成功
$ curl -XGET http://172.17.0.1:5000/v2/_catalog
# {"repositories":["ubuntu"]} 成功
# 第八步:从私服仓库,拉取镜像
$ docker pull 172.17.0.1:5000/ubuntu:v1.0
容器数据卷
概念
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时,删除其挂载的数据卷。
解决痛点:实现容器内数据同步(备份)到宿主机,实现数据共享和备份。
宿主机vs容器之间映射
$ docker run -d -p 5000:5000 -v /宿主机绝对路径目录:/容器内目录 --privileged=true registry
各个参数:
-v :启用数据卷
–privileged=true :开启同步/备份权限
读写规则
$ docker run -d -p 5000:5000 -v /宿主机绝对路径目录:/容器内目录:ro --privileged=true registry
/容器内目录:ro 镜像名 表示:容器自己只能读取不能写 ro=read only
此时如果宿主机写入内容,可以同步给容器内,容器可以读取到,但是容器内不可写入
卷的继承和共享
- 创建容器u1与宿主机共享
$ docker run -it --privileged=true -v /mydocker/u:/tmp/u - name u1 ubuntu
- 容器u2容器,继承容器u1
$ docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
软件安装(避坑)
一、Tomcat
$ docker run -d -p 8081:8080 --name t1 tomcat
问题:运行容器后,访问页面报错,看不到"一只猫"
解决:因为新版本tomcat首页路径变更,将目录下的.dist文件改名。或者选择其他的tomcat版本
二、Mysql(5.7版本)
# 错误的创建mysql容器方式:
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
问题1:在容器mysql中,插入‘中文’,出现错误!!
问题2:数据库容器一旦被删除,数据将彻底丢失!损失惨重!!
# 正确的创建mysql容器方法:
$ docker run -d -p 3307:3306 --privileged=true \
-v /mdy/mysql/log:/var/log/mysql\
-v /mdy/mysql/data:/var/lib/mysql\
-v /mdy/mysql/conf:/etc/mysql/conf.d\
-e MYSQL_ROOT_PASSWORD=123456 --name mysql_cms mysql:5.7
解决问题1(中文乱码):
在服务器上,查看编码全为拉丁编码,所以需要将服务器字符集编码改完“utf8”.
mysql> show VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
注意:在一些连接软件上,会自动转换展示,但是根本还需要在服务器上进行查看编码,设置编码!
因为创建了数据卷,所以在宿主机目录:/mdy/mysql/conf 新建文件 my.cnf
加入如下代码
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
然后重启mysql_cms容器实例 docker restart myslq_cms
,并且再一次查看字符集是否都为utf8编码。搞定!!!
解决问题2(数据备份):
创建容器的时候,需要在宿主机进行数据卷创建备份命令,防治删除后,好恢复备份的数据!具体操作:
重新执行创建mysql容器的命令,即可解决!!!!
三、Redis
# 正确创建redis的方式:
$ docker run -d -p 6379:6379 --privileged=true \
-v /mdy/redis/redis.conf:/etc/redis/redis.conf \
-v /mdy/redis/data:/data \
--name myredis redis:6.0.8 redis-server /etc/redis/redis.conf
数据容器卷创建后,可在目录/mdy/redis/
目录下,更改配置redis.conf
文件:
1、基础设置
# 1.设置Redis的密码
# Redis默认是没有密码验证的,为保证Redis的安全性,需要设置密码进行验证。(123456为自己设置的密码)
requirepass 123456
# 2.允许redis外地连接必须注释掉
# bind 127.0.0.1
# 3.daemonize no
# 将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
2、限制内存使用
限制Redis使用的最大内存,以防止Redis使用过度导致内存溢出(2gb为Redis使用的最大内存值)。
maxmemory 2gb
3、开启持久化
在Redis配置文件中,有两种不同的持久化方式:RDB和AOF。
RDB是将Redis在内存中存储的数据定期以快照的形式写入磁盘。
AOF是将Redis服务器的操作记录以日志的形式写入磁盘,以保证Redis在重启后能够恢复操作记录并还原数据。
在开启持久化时,需要根据自己的实际情况来进行选择。在配置文件中设置如下:
# 开启RDB
save 900 1
save 300 10
save 60 10000
# 开启AOF
appendonly yes
appendfsync everysec
其中,save命令指定了保存快照的频率,分别是在900秒(15分钟)内至少有1个键被修改,300秒(5分钟)内至少有10个键被修改,60秒(1分钟)内至少有10000个键被修改。appendonly命令用于开启AOF持久化,appendfsync命令用于设置AOF日志刷写频率。
4、调整Redis的并发连接数
可以通过设置maxclients参数来限制并发连接数,防止Redis被大量连接攻击。(10000为最大并发连接数)
maxclients 10000
5、设置Redis的备份数量
在Redis集群中,为了保证数据的可用性和安全性,我们需要设置备份数量。
其中,masterip和masterport为主Redis服务器的IP地址和端口号。
replicaof masterip masterport
6、开启集群模式
在Redis配置文件中,可以设置Redis的集群模式,以提高Redis的性能和可用性。
其中,cluster-enabled命令用于开启Redis的集群功能,cluster-config-file命令用于指定集群的配置文件。
cluster-enabled yes
cluster-config-file nodes.conf
特别注意:配置文件redis.conf
更改以后,需要重启容器!!