Docker的使用

一、Dockerfile

FROM centos # 基础镜像,也可以使用命令docker images 查看已有的镜像,使用对应的镜像作为基础镜像
RUN yum install wget # 运行命令
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

二、构建Docker镜像

将需要的文件存放至Dockerfile同级目录

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)

docker build -t nginx:v1 .
# 注:最后的 . 代表本次执行的上下文路径

三、上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

四:指令详解

1、COPY

复制指令,下文目录中复制文件或者目录到容器里指定路径。

格式:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建

2、ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

    值得注意的是,ADD和COPY的文件必须与Dockerfile文件同级

3、CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

……………………

完整的Dockerfile实例

FROM ubuntu:latest  # 基础镜像

ARG DEBIAN_FRONTEND=noninteractive  # 避免安装tzdate依赖时进行选择导致bulid不成功
ENV TZ=Asia/Shanghai

RUN mkdir -p /root/.pip && mkdir -p /home/Project

ADD sources.list /etc/apt/sources.list  # 添加文件
ADD pip.conf /root/.pip/pip.conf
ADD uwsgi.ini /etc/uwsgi/book/uwsgi.ini
COPY Python-3.7.5 /home/Python-3.7.5  # 添加文件夹
COPY my_django /home/Project/my_django


RUN echo -e "nameserver 223.5.5.5\nnameserver 223.6.6.6" > /etc/resolv.conf \ # 使用命令写入配置
&& apt-get update \
&& apt-get install -y gcc make cmake build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl nginx python3-pip --fix-missing \
&& cd /home/Python-3.7.5 && ./configure && make && make install \
&& ln -s /usr/local/bin/python3 /usr/bin/python \
&& cd /home/Project/my_django \
&& pip install poetry \
&& poetry install

EXPOSE 8080  # 启动镜像时对外映射的端口

CMD ["uwsgi","--ini","/home/Project/my_django/uwsgi.ini"]  # 启动镜像时运行的命令

WORKDIR /home/Project/my_django  # 启动镜像时自动处于的工作路径

  1. docker build出现交互式时区(tzdate)设置解决。在Dockerfile中FROM下面加上如下配置

    ARG DEBIAN_FRONTEND=noninteractive
    ENV TZ=Asia/Shanghai
    

清理缓存

docker system prune -a

commit容器 (尽量少用)

docker commit 容器id 容器名:TAG 

将镜像导出/导入

# 导出
docker save 镜像名:tag | gzip > 压缩包名.tar.gz
# 导入
docker load -i 压缩包名.tar.gz
# 批量导入当前目录下所有的镜像(目录下全是镜像)
ls | xargs -t -I {} docker load -i {}

# 导出,导出的是容器
docker ps 
docker export 容器id > 压缩包名.tar
# 导入
docker import 压缩包名.tar 镜像名:tag

查看官方镜像

docker search 镜像名 --filter "is-automated=true"
# 例子
docker search ubuntu --filter "is-automated=true"

加速pull docker 镜像配置

vim vim /etc/docker/daemon.json

配置如下
{
        "registry-mirrors":[
                "https://cr.console.aliyun.com", # 阿里云
                "https://console.huaweicloud.com/swr", # 华为
                "https://docker.mirrors.ustc.edu.cn" # 教育机构
        ],            
    "insecure-registries":["192.168.1.21:5000","172.16.213.39:5000"]    #本地镜像仓库地址,可以配置多个,用英文逗号分隔
}

查看某镜像的信息

 docker inspect 容器名:tag
 # 例子
 docker inspect mysql:latest

docker run

docker run -p 本机映射端口:镜像映射端口 -d --name 启动镜像名称 -e 镜像启动参数 镜像名称:镜像版本号
# 例子
docker run -d -p 53306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql_1 mysql:latest

docker run -it --rm -v 本地目录1:服务器目录1 -v 本地文件1:本地文件1 容器id或者容器名:tag bash
或者
docker run -d -v 本地目录1:服务器目录1 -v 本地文件1:本地文件1 容器id或者容器名:tag # 后台运行

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

# -d 后台运行
# -d 必须使用在-p之前,镜像名称:镜像版本号 必须写在最后
# -e 添加环境配置
# -v 文件(夹)映射
# -it 交互模式
# --rm 退出容器后自动删除容器

进入后台启动了的容器

#方式一,进入容器后开启一个新的终端
docker exec -it 容器id bash
# -it 交互模式

#方式二,进入容器正在执行的终端,不会启动新出的进程
docker attach 容器id

启动容器

'''启动'''
docker start [容器id]
'''停止'''
docker stop [容器id]
docker kill [容器id] # 强制停止
'''重启'''
docker restart [容器id]

退出容器

# 命令
exit
# 快捷键
ctrl + d
# 推出容器但不停止容器
ctrl + p + q

删除容器

docker rm [容器id]
docker rm -f $(docker ps -aq) # 查询所有启动容器id并强制(-f)删除
docker ps -aq | xargs docker rm # 查找所有的容器id,递归(xargs)删除

docker 日志

# 容器日志
docker ps
docker logs 容器id
# 服务日志
docker service ls # 列出所有服务
docker service ps 
docker service logs 服务id

查看容器/镜像信息

docker inspact 容器/镜像id

本地文件与docker文件的拷贝

容器 —> 本地

$ docker cp 容器id:容器内部文件路径 本地路径

本地 —> 容器

$ docker cp 本地路径 容器id:容器内部文件路径

将本地文件映射到容器

docker run -d 容器id -v 

修改docker镜像的启动命令

docker commit --change="WORKDIR /root" -c 'CMD ["python","main.py"]' container_name image_1:demo
–change 可以写入dockerfile的语法语句
-c 可以写入启动命令
最后接上修改之后的镜像名称

docker备份

docker run -d --volumes-from 启动的容器名/容器id --name 容器名 镜像名:tag

# --volumes-from 共享挂载卷
# 当一个镜像启动多个容器,并配置共享挂载卷,只要有一个容器还在使用,则挂载卷就存在不会被删除。实现了备份功能。实际上是创建容器时,在本地创建了文件路径,是从本地挂载到了对应的容器内。

上传docker image到docker hub

# 登录
docker login -u walden007 -p xxxxxxxxx
docker push

docker swarm 使用

一、创建节点

[root@VM-8-14-centos]# docker swarm init  --advertise-addr 主机ip
Swarm initialized: current node (0j0hcqwgj9viu8e81hw87a4jg) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-099xe0xcepoj8k8j74b476gwpzg56dcq98j8mi1zgdr6r9mq0v-1rqn1cgtbx70vd7pavyjn61it 主机ip:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker swarm join-token manager 查看已经添加的token
# Options: 
    --advertise-addr: 多网卡的情况下,指定需要使用的ip
    --listen-addr: 指定监听的 ip 与端口
    --availability: 节点的有效性("active"|"pause"|"drain")
    Active:集群中该Node可以被指派Task
    Pause:集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
    Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的Node上
    # 参考:
    docker swarm init --advertise-addr 192.168.89.14 --listen-addr 192.168.89.14:2377

二、添加节点

# 添加环境:主机1已经创建了swarm集群,主机2需要加入这个集群。且主机1与主机2能相互ping通
# 主机2
[root@VM-8-14-centos]# docker swarm  join --token SWMTKN-1-099xe0xcepoj8k8j74b476gwpzg56dcq98j8mi1zgdr6r9mq0v-1rqn1cgtbx70vd7pavyjn61it 主机1ip:2377
This node joined a swarm as a worker.# 说明添加成功,主机2成为了swarm集群中的worker


''' >>> 注意 在主机2 添加到主机1的swarm集群里是可能出现一下的报错
''' >>> Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 106.53.103.178:2377: connect: no route to host"
''' >>> 此时可以考虑防火墙问题,将主机1的防火墙关闭,或者只开启2377/tcp端口代码如下
''' >>> 关闭防火墙 systemctl stop firewalld
''' >>> 开启2377端口 firewall-cmd --zone=public --add-port=2377/tcp --permanent
''' >>> 执行以上个命令后需要重新加载防火墙使设置生效 firewall-cmd --reload
''' >>> 然后再在主机2执行 docker swarm  join --token ...命令

''' >>> 如果还是添加不上,报如下错误
''' >>> Error response from daemon: Timeout was reached before node joined. The attempt to join the swarm will continue in the background. Use the "docker info" command to see the current swarm status of your node.
# 可以使用命令:telnet 主机IP地址 2377    进行测试,如果能连通则表示改主机IP开放了2377端口,反之则没有
''' >>> 进入某服务器网页管理器,添加防火墙规则 开放2377的TCP端口

三、创建网络

[root@VM-8-14-centos]# docker network create --driver overlay --attachable 自定义集群网络名
[root@VM-8-14-centos]# docker network ls # 查看网络
ez4cwhd80n69   ai_center_network   overlay   swarm
d13f39273a0d   bridge              bridge    local
6405d33c608c   docker_gwbridge     bridge    local
eb28abc49c02   host                host      local
qlhatgxhzqal   ingress             overlay   swarm
fa87c048f23b   none                null      local

四、连接集群网络

# 不管是主机1还是主机2使用同样的命令将容器添加到集群网络
[root@VM-8-14-centos]# docker run -itd --network=自定义集群网络名 --name=容器命名 容器id/容器名:tag bash

五、退出swarm集群

[root@VM-8-14-centos]# docker swarm leave [-f]
# 管理员节点(master node)需要加上-f参数
# 工作节点(work node)不需要加上-f参数

六、查看未启动服务的日志

docker service ps --no-trunc <serviceName>

docker可视化管理器

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

docker 网络

docker 网络命名

docker run -d --link docker网络链接名 镜像id:tag
# --link 使用该配置可以实现以 docker网络链接名 docker容器网络通信(只能用其他容器连接已经设置--link的容器)
# 不建议使用,--link会使用docker0的网关,不能实现使用docker容器名进行访问docker网络

docker 网络模式

bridge: 桥接 docker(默认,自己创建也使用bridge模式)
none: 不配置网络
host: 和宿主机共享网络
container: 容器网络连通(很少用,局限性大)

docker自定义网络的创建/使用

# 创建
docker network create --dirver bridge --subnet 子网ip/掩码数 --gatway 网关 docker网络名
# 使用
docker run -d --net docker网络名 镜像id
# 测试
docker network create --dirver bridge --subnet 192.168.0.0/16 --gatway 192.168.0.1 test-net
docker run -d --net test-net --neme docker-1 as5dfdf5f
docker run -d --net test-net --neme docker-2 as5dfdf5f
docker exec -it docker-1 ping docker-2
# 结果发现是ping得通的

将默认docker0子网内的docker连接到自定义网络中

docker network connect [OPTIONS] 自定义网络名 容器名/容器id
# 例子
docker network connect test-net docker-sub-net

# 经过发现经过命令将 docker-sub-net 容器的网络加到了test-net子网中
# 简而言之就是一个容器两个ip
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值