加载中...

docker


Docker

docker-ce 开源

docker-ee 收费

安装

  1. 卸载原来的docker

    yum remove docker
  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

    {
    	"registry-mirrors":[
    		"https://1nj0zren.mirror.aliyuncs.com",
    		"https://docker.mirrors.ustc.edu.cn",
    		"http://f1361db2.m.daocloud.io",
    		"https://registry.docker-cn.com"
    	]
    }

    更新时间: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
  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   # 起名字启动
-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

查看本地镜像

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

端口映射

docker run -d -P redis  # 端口是随机产生
docker run -d -p 宿主机上的端口:容器内的端口 redis   # 指定端口
docker run --network=host redis  # 占用主机的端口运行,可与主机其它程序互通
# --network 有多种用法(参数),自行百度

查看容器的资源占用率

# 语法: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 run -d -p 5000:5000 -v /opt/register:/var/lib/registry registry   # 创建本地仓库或启动本地仓库
docker tag redis 127.0.0.1:5000/redis # 修改名称
docker push 127.0.0.1:5000/redis      # 上传到仓库
curl  127.0.0.1:5000/v2/_catalog      # 查看结果
docker pull 127.0.0.1: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

安装

  • 手工安装

    # 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 ps # 查看运行中的容器
docker-compose images # 查看镜像
docker-compose rm # 删除所有停止的容器

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 许可协议。转载请注明来源 无夜 !
评论
  目录