加载中...

docker


Docker

docker-ce 开源

docker-ee 收费

安装

  1. 卸载原来的docker

    yum remove docker
    # centos8需要卸载podman buildah
    yum erase podman buildah
  2. 下载阿里云的docker仓库

    wget -O /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  3. 安装

    yum install -y docker-ce
  4. docker 加速器:文件存放路径/etc/docker/daemon.json

    # 获取阿里云镜像加速地址:https://cr.console.aliyun.com/?spm=a2c4g.11186623.0.0.19e658afP1Zcdv,进入后在左侧导航栏选择镜像工具 > 镜像加速器,在镜像加速器页面就会显示为您独立分配的加速器地址。
    
    {
    	"registry-mirrors":[
    		"https://1nj0zren.mirror.aliyuncs.com",
    		"https://docker.mirrors.ustc.edu.cn",
    		"http://f1361db2.m.daocloud.io",
    		"https://registry.docker-cn.com"
    	]
    }
    
    # 更多配置说明可参考:https://www.cnblogs.com/golinux/p/12759674.html

    更新时间:2024-06-19:现在国内加速站相继停止(某些原因),所以上面的加速器失效,只能使用代理直接访问docker hub,操作如下:

    配置docker代理:

    mkdir -p /etc/systemd/system/docker.service.d
    
    cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf 
    [Service]
    Environment="HTTP_PROXY=http://10.240.212.128:8000"		# 此处修改为自己的代理
    Environment="HTTPS_PROXY=http://10.240.212.128:8000"	# 此处修改为自己的代理
    EOF
    
    systemctl daemon-reload
    systemctl restart docker

    配置容器运行时的代理(相当于你在容器运行的时候加入了 HTTPS_PROXY 环境变量):

    mkdir ~/.docker
    
    cat <<EOF > /root/.docker/test.json
    {
        "proxies": {
            "default": {
                "httpProxy": "http://10.240.212.128:8443",
                "httpsProxy": "http://10.240.212.128:8443",
                "noProxy": "localhost,127.0.0.1"
            }
        }
    }
    EOF
    
    systemctl restart docker
  5. 启动docker

    systemctl start docker

Docker简介

镜像

类似于安装系统时候需要的iso镜像文件

容器

启动之后的镜像

仓库

存放镜像

可以用公用的

可以有私有的

class myclass():
    def __init__():
        pass
    
m=myclass()

测试docker是否安装正常

# 语法:docker run 镜像名称
docker run hello-world  # 启动hello-world镜像,如果没有则下载最新版本

run  运行
hello-world 镜像名称

Docker常用命令

搜索镜像

# 语法:docker search 镜像名称
docker search mysql  # 搜索镜像名称

NAME(名字)                             DESCRIPTION(描述信息)                                     STARS(点赞数)              OFFICIAL(是否为官方)            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   8499                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   2942                [OK]                

下载镜像

# 语法:docker pull 镜像名称
docker pull redis  # 下载redis镜像

运行容器

  • 如果本地没有此镜像,则会取docker hub 下载
  • 如果有的话,则直接根据参数运行
# 语法:docker run 镜像名称
-d    # 后台启动
docker run --name redis-test -d redis   # 起名字启动

bash -c    # 启动并运行指定命令
docker run -d centos bash -c "while true;do echo helloworld;sleep 1;done" # 后台运行centos容器并没隔一秒输出helloworld。需要手动结束
-it  # 进入镜像操作
i   # 交互式操作
t   # 终端
exit   # 退出镜像

--rm   # 容器退出,并把容器删掉
docker run -it --rm ubuntu bash

# 资源限制,memory选项参数最小4M
docker run --memory=500m redis

--env  # 设置容器内的环境变量,要设置多个环境变量,需要重复设置
docker run -itd --env HTTP_PROXY="http://10.240.212.128:8443" \
                --env HTTPS_PROXY="http://10.240.212.128:8443" centos bash

重启策略

docker run -d --name redis-test --restart always redis

--restart # docker容器重启策略,但不能与--rm同时使用
# no,默认策略,在容器退出时不重启容器
# on-failure,在容器非正常退出时(退出状态非0),才会重启容器
# on-failure:3,在容器非正常退出时重启容器,最多重启3次
# always,在容器退出时总是重启容器
# unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

# 查看容器重启次数
docker inspect -f "{{ .RestartCount }}" redis-test
# 查看容器最后一次的启动时间
docker inspect -f "{{ .State.StartedAt }}" redis-test

补充:docker容器的退出状态码

# docker run的退出状态码如下:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

查看本地镜像

docker images
-q 只显示id

查看启动的容器

docker ps
-a  显示启动过的所有的容器

删除镜像

# 语法:docker rmi 镜像名称
docker rmi redis  # 删除redis镜像
默认情况下不能删除启动过容器的镜像
-f 强制删掉

删除容器

# 语法:docker rm [镜像名称或id(id只用输入前四位即可)]
docker rm redis  # 根据redis容器
默认不能删除启动中的容器
-f 强制删除

退出容器不关闭容器

ctrl+p,q

进入正在启动中的容器

# 语法:docker exec -it [镜像名或镜像id] bash
docker exec -it id|name bash   # 根据id前三位或者名称进入容器
bash 是进入容器后执行的命令

查看容器的log日志

# 语法:docker logs [镜像名或镜像id]
docker logs id|name
-f 查看实时日志输出

导出镜像

# 语法:docker save -o [导出的文件名] [镜像名称]
docker save -o name imagename|id
docker save id|imagesname > centos.tar.gz

导入镜像

docker load -i centos.tar.gz
docker load < centos.tar.gz 

提交(把容器导出为镜像)

docker commit -m "message" 运行中的容器id
# or 二选一即可
docker commit 运行中的容器id 要生成的镜像名

修改镜像名称

# 语法:docker tag [镜像id或名称] [新名称]
docker tag redis newredis  # 修改redis镜像为newredis
如果不存在tag,则在原来的镜像基础上加上tag信息,如果存在原来的tag信息,则会复制一份

删除所有的关闭状态下的容器

docker container prune

数据卷

将宿主机的文件挂载到容器里面,如果宿主机目录不存在,则会自己创建

-v 宿主机目录:容器目录
docker run -it -v /opt/myetc:/etc centos bash

将宿主机文件上传到容器中(在宿主机操作)

docker cp 宿主机文件目录 容器名:要上传到的容器目录
docker cp /opt/myetc centos:/etc/bin

使用volume卷

docker volume ls # 查看数据卷
docker volume create my-vol # 创建一个数据卷
docker volume inspect my-vol # 查看数据卷详情,Mountpoint参数是数据卷在本地的挂载位置
docker run -it -v my-vol:/etc centos bash 
docker run -it -v mytest:/etc centos bash # 如果数据卷名mytest不存在,会自动创建该数据卷

注意:挂载宿主机目录到容器内时,会将宿主机目录覆盖容器内目录!如果宿主机目录为空,容器目录不为空,挂载后的容器目录则为空,以宿主机目录为主!如果想把容器内文件映射出来(如配置文件),可以用volume,然后通过查看数据卷位置去修改内容(比如配置文件)即可。

端口映射

docker run -d -P redis  # 端口是随机产生
docker run -d -p 宿主机上的端口:容器内的端口 redis   # 指定端口
docker run --network=host redis  # 占用主机的端口运行,可与主机其它程序互通
# --network 有多种用法(参数),自行百度
# 网络配置可参考:https://blog.csdn.net/hetoto/article/details/99892743

查看容器的资源占用率

# 语法:docker stats 容器id或name
docker stats redis # 查看redis容器状态
docker info  # 查看docker信息
docker inspect 镜像名称  # 查看镜像信息

Dockerfile

# Dockerfile文件中要写的内容
FROM mycentos  # 指定基础镜像
RUN yum install -y wget # 执行命令
RUN mkdir /mydata
COPY a.txt /mydata # 将本地文件复制到镜像里面
ADD etc.tar.gz /mydata  # 将本地文件复制到进项内,如果是压缩包,则自动解压
WORKDIR /mydata # 指定工作目录,exec 进入时候默认的目录
ENV # 设置变量
VOLUME # 设置数据卷
EXPOSE 5900 # 设置端口
CMD ["nginx", "-g", "daemon off;"] # 执行命令
# 语法:docker build -t [要生成的镜像名称] [要生成的目录(目录中必须有Dockerfile文件,-f可指定文件)]
docker build -t mydocker .   # 生成一个名为 mydocker 的镜像
docker build -t myflask -f flask.   # 指定flask为dockerfile文件并生成一个名为 myflask 的镜像
# 说明:执行该语句会依次执行Dockerfile中的每行命令,最终完成镜像生成.可用 docker images 命令进行查看

copy 和add的区别

add 是自动解压

CMD只能有一个,RUN可以有多个

Docker本地私有仓库

私有仓库有两种:

  • Docker Registry,Docker官方提供的镜像仓库存储服务,使用简单
  • Harbor,是Docker Registry的更高级封装,提供了友好的Web UI界面,角色和用户权限管理,用户操作审计等功能。

Docker Registry使用

Docker Registry 实际上是启了一个registry容器,这个容器提供仓库的功能。

镜像访问形式:registry.devops.com/demo/hello:latest,若没有前面的url地址,则默认寻找Docker Hub中的镜像,若没有tag标签,则使用latest作为标签。比如docker pull nginx会被解析成docker pull docker.io/library/nginx:latest

docker run -d -p 5000:5000 -v /opt/register:/var/lib/registry registry   # 创建本地仓库或启动本地仓库

docker tag nginx:alpine 127.0.0.1:5000/nginx:alpine # 修改名称
docker push 127.0.0.1:5000/nginx:alpine      # 上传到仓库
curl  127.0.0.1:5000/v2/_catalog      # 查看镜像
curl  127.0.0.1:5000/v2/nginx/tags/list # 查看镜像的tag
docker pull 127.0.0.1:5000/nginx:alpine # 从仓库下载镜像

# 假设别人向我们地址进行推送,这时会因为安全提示让使用https(如果只是自己使用,用localhost或127.0.0.1不受限,可以不配置信任地址)
[root@wuye ~]# docker push 192.168.182.130:5000/redis
Using default tag: latest
The push refers to repository [192.168.182.130:5000/redis]
Get "https://192.168.182.130:5000/v2/": http: server gave HTTP response to HTTPS client
# 此时我们需要修改配置文件,把我们的仓库地址改为信任的仓库地址,此时就正常了
docker tag redis 192.168.182.130:5000/redis # 修改名称
docker push 192.168.182.130:5000/redis      # 上传到仓库
curl  192.168.182.130:5000/v2/_catalog      # 查看镜像
curl  192.168.182.130:5000/v2/nginx/tags/list # 查看镜像的tag
docker pull 192.168.182.130:5000/redis      # 下载到仓库

要修改文件/etc/docker/daemon.json

{
	# 配置加速
    "registry-mirrors": [
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://f1361db2.m.daocloud.io",
        "https://registry.docker-cn.com"
    ],
    # 不安全的仓库地址:本地仓库地址
     "insecure-registries": [
    	"192.168.182.130:5000"
  	]
}

docker-compose

什么是docker-compose?其实就是编排工具中的一个

编排(排版)工具有:swam、ocker-compose

yml 可以用来做配置文件

其它配置文件有:cfg、ini、xml、json

后缀名: yml yaml

数据类型:string、int、列表: [ ] -、字典:key:value

使用YAML文件的有,YAML可直接转为python的字典:salt、ansible、docker-compose、k8s

docker-compose参数说明:https://blog.csdn.net/qq_36148847/article/details/79427878

docker-compose官方文档:https://docs.docker.com/compose/gettingstarted/

安装

  • 手工安装

    # a.1. 可以通过https://github.com/docker/compose/releases 官方地址下载最新的docker-compose(如:sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 或者下载后直接上传到服务器指定位置即可)
    # a.2. 如果系统没有安装curl,可以采用wget来安装(如:sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m`);要是用最新版本只需更换1.23.1版本号即可,其余勿更改!!!
    # b. 增加执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    # c、测试安装结果
    docker-compose version
  • pip 安装

    # 1. 通过pip -v检查pip 是否安装及版本
    # 2. yum -y install epel-release 安装pip基础
    # 3. yum install python-pip 安装pip的python 支持
    # 4. pip install --upgrade pip 完成pip的安装
    # 5. pip install docker-compose 来安装docker-compose
  • 命令补全

    curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

使用

docker-compose.yml文件,进阶版

version: '3'
services:
   web: 
     build: 
        context: . # 指定dockerfile文件目录在哪
        dockerfile: dockerfile文件  # 指定目录中的dockerfile文件
     ports:
     - "3000:3000"
   redis:
     image: "redis"  # 镜像,默认使用本地的,如果没有则下载

Dockerfile文件

from flask import Flask
from redis import Redis

app=Flask(__name__)
redis=Redis(host="redis",port=6379)

@app.route("/")
def index():
    count= redis.incr("hits")
    return "该页面被访问了{}次".format(count)

if __name__=="__main__":
    app.run(port=3000,host="0.0.0.0")

Docker-compose常用命令

docker-compose build      # 重新构建容器
docker-compose up -d --build # 构建并启动所有容器,如果镜像存在也重新构建
docker-compose up -d      # 启动所有容器
docker-compose ps         # 查看运行中的容器
docker-compose images     # 查看镜像
docker-compose rm         # 删除所有停止的容器
docker-compose config     # 显示解析到的配置文件内容

docker-compose.yml文件,初级版

version: '3' #版本
services:
   web: 
     build: . # dockerfile文件叫Dockerfile
     ports:
     - "3000:3000"
   redis:
     image: "redis"

例子:

version: "3" 
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:  # 先启动谁
      - redis
      - db

dockerfile 部署crm

FROM python:3.7-alpine3.10  # 基础镜像
RUN mkdir /data   # 执行命令
COPY requirements.txt /data # 复制文件
COPY mycrm /data  #复制目录的时候,,默认情况下是复制目录下的所有文件,如果要复制整个目录,则需要在后面加上目录名称
WORKDIR /data # 指定工作目录
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple #安装python第三方的包
EXPOSE 8080 # 启动时候的端口,必须的
CMD python manage.py runserver 0.0.0.0:8080 #启动django

docker网络工具:calico(k8s也在使用的)

示例:使用dockerfile部署flask

第一步:编写flask项目,myflask.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello,This is my first dockerflask"

if __name__=="__main__":
    app.run(host="0.0.0.0",port=9000)

第二步:编写flask文件

FROM python:3.7-alpine3.10
RUN mkdir /data
ADD myflask.py /data
RUN pip install flask -i https://pypi.douban.com/simple
WORKDIR /data
CMD ["python","myflask.py"]

第三步:生成镜像

docker build -t myflask -f dockerflask .

第四步:查看镜像是否生成并启动验证,启动成功则镜像生成完毕。

docker images
docker run -d -p 3000:9000 myflask

如果创建了本地仓库,则可上传至本地仓库,也就是把上面的本地私有仓库流程又走了一遍,改个镜像名称即可。我这里就不说啦。


文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录