【Docker】一篇就够了之【基础篇】

镜像

查看镜像
# 查看本地镜像
$ 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清理工具删除。一般镜像的REPOSITORYTAG都为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”

在这里插入图片描述

第二步:先创建命名空间,再创建镜像仓库名称(可以公开)

在这里插入图片描述
在这里插入图片描述

第三步:根据提供命令,进行登陆发布
在这里插入图片描述

  1. 登录阿里云Docker Registry
$ docker login --username=[阿里账号]  registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时,设置的密码
(注意:您可以在访问凭证页面修改凭证密码)
  1. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/voll/woerzx:[镜像版本号]
  1. 将镜像推送到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][镜像版本号]参数。
  1. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
  1. 示例

使用"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更改以后,需要重启容器!!

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值