Docker 的简单使用

Posted l521z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 的简单使用相关的知识,希望对你有一定的参考价值。

目录:

Docker

docker-ce 开源

docker-ee 收费

Docker的安装

  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"
        ]
    }
  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

修改镜像名称

# 语法: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 run -d -P redis  # 端口是随机产生
docker run -d -p 宿主机上的端口:容器内的端口 redis   # 指定端口

查看容器的资源占用率

# 语法: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

 

Demo:使用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

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

以上是关于Docker 的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

创建自己的代码片段(CodeSnippet)

为啥这段代码会泄露? (简单的代码片段)

markdown docker-compose片段

sh Docker片段

如何使用Android片段管理器传递变量[重复]

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围