docker定义与安装、镜像、容器、应用部署、迁移与备份、dockerfile及Docker私有仓库

文章目录

      • 1、docker定义与安装
        • 1.1、定义
        • 1.2、Docker概念和使用
          • 1.2.1、镜像(Image)
          • 1.2.2、容器(Container)
          • 1.2.3、仓库(Repository)
        • 1.3、在CentOS系统上安装Docker
          • 1.3.1、更换系统yum源
          • 1.3.2、更新一下系统
          • 1.3.3、更新并安装Docker-CE
          • 1.3.4、启动并设置开机自启动
          • 1.3.5、测试启动
      • 2、镜像
        • 2.1、获取镜像
        • 2.2、查看镜像信息
        • 2.3、为镜像添加tag并推送到远程服务器
        • 2.4、使用inspect命令查看详细信息
        • 2.5、使用history命令查看镜像历史
        • 2.6、搜索镜像
        • 2.7、删除和清理镜像
        • 2.8、保存容器为镜像
      • 3、容器
        • 3.1、查看容器
        • 3.2、创建与启动容器
          • 3.2.1、交互式方式创建容器
          • 3.2.2、守护式方式创建容器
        • 3.3、停止与启动容器
        • 3.4、文件拷贝
        • 3.5、目录挂载
        • 3.6、查看容器IP地址
        • 3.7、删除容器
      • 4、应用部署
        • 4.1、在容器内部署redis,把配置文件和数据目录映射到宿主机
        • 4.2、基于python3.6构建自己的镜像启动容器
      • 5、迁移与备份
      • 6、dockerfile
        • 6.1、定义
        • 6.2、dockerfile指令
        • 6.3、使用脚本创建镜像
          • 6.3.1、创建目录
          • 6.3.2、创建文件Dockerfile(vi Dockerfile)
          • 6.3.3、执行命令构建镜像
          • 6.3.4、查看镜像是否建立完成
        • 6.4、完整演示
      • 7、Docker私有仓库
        • 7.1、私有仓库搭建与配置
          • 7.1.1、拉取私有仓库镜像
          • 7.1.2、启动私有仓库容器
          • 7.1.3、打开浏览器 输入地址http://ip地址:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
          • 7.1.4、修改daemon.json
          • 7.1.5、重启docker 服务
        • 7.2、镜像上传至私有仓库
          • 7.2.1、标记此镜像为私有仓库的镜像
          • 7.2.2、再次启动私服容器
          • 7.2.3、上传标记的镜像

1、docker定义与安装

1.1、定义

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境

Docker官方文档比较全:官方文档

1.2、Docker概念和使用

Docker中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握Docker技术尤为重要
镜像:启动容器的模板
容器:对外提供服务的实例
仓库:存放镜像仓库

1.2.1、镜像(Image)

Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统

1.2.2、容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等

1.2.3、仓库(Repository)

用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来
在CentOS系统上安装Docker

1.3、在CentOS系统上安装Docker

Docker目前支持CentOS7及以后版本。系统的要求跟Ubuntu情况类似,64位操作系统,内核至少是3.10以上

1.3.1、更换系统yum源
# 备份原来YUN源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 运行 yum makecache 生成缓存
yum makecache
1.3.2、更新一下系统
yum update -y --exclud=kernel*
# 已加载插件: fastestmirror
# Loading mirror speeds from cached hostfile
# * base: mirrors.aliyun.com
# * extras: mirrors.aliyun.com
# * updates: mirrors.aliyun.com
# ...
1.3.3、更新并安装Docker-CE
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
1.3.4、启动并设置开机自启动
systemctlenable--nowdocker
1.3.5、测试启动
dockerinfo

2、镜像

2.1、获取镜像
镜像是运行容器的模板,官方DockerHub仓库已经提供了许多镜像共开发者使用。如果我们需要获取某个镜像则可以去docker仓库下载所需的镜像
下载镜像的格式: docker pull [仓库的URL]/[名称空间]/[仓库的名称]:[版本号]
# 以获取redis为例
docker pull redis
默认: docker pull docker.io/library/redis:latest

docker pull registry.cn-hangzhou.aliyuncs.com/xxx/python:v5
2.2、查看镜像信息
镜像主要包括镜像文件、镜像tag以及镜像详细信息等
两种方式:
docker images      
docker image ls

docker images
# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# redis               latest              74d107221092        12 days ago         104MB

# 参数说明
REPOSITORY: 镜像名称
TAG: 镜像版本号
IMAGE ID: 镜像ID
CREATED: 创建时间到现在的时间
SIZE: 指镜像大小

image子命令主要支持如下选项:
docker images -a: 列出所有(包括临时文件)镜像文件
docker images --digests: 列出镜像的数字摘要值
docker images -q: 仅显示ID信息
2.3、为镜像添加tag并推送到远程服务器
docker tag [原镜像名称]:[版本号]  [新的名称]:[新版本号]: docker tag redis:latest registry.cn-hangzhou.aliyuncs.com/xxx/redis:v1

# 登录阿里云仓库
docker login [参数] [仓库URL] 
docker login --username=阿里云的用户名 registry.cn-hangzhou.aliyuncs.com
# 会提示输入密码,密码输入成功即登录成功

# 推送命令(将刚才打好tag的镜像推送到远程服务器)
docker push [镜像名称]: docker push registry.cn-hangzhou.aliyuncs.com/xxx/redis:v1
2.4、使用inspect命令查看详细信息
使用dockerinspect命令获取镜像的详细信息,包括PID、作者、架构等
docker inspect [参数] [镜像ID]|[镜像名称]:[版本号]: docker inspect redis
docker inspect -f "{{ .Id }}" redis
docker inspect -f "{{ .ContainerConfig.Hostname }}" redis
2.5、使用history命令查看镜像历史
docker history [镜像名称]|[镜像ID]: docker history redis
2.6、搜索镜像
docker search [参数] [镜像名称|镜像简介]

docker search redis
# NAME                             DESCRIPTION                                     STARS               # OFFICIAL            AUTOMATED
# redis                            Redis is an open source key-value store that…   8792                # [OK]                
# bitnami/redis                    Bitnami Redis Docker Image                      168                                     [OK]
#sameersbn/redis                                                                  82                                      [OK]

NAME: 镜像名称
DESCRIPTION: 简介
STARS: 收藏个数
OFFICIAL: 是否是官方镜像
AUTOMATED: 是否是自构建的镜像

# limit n: 只显示n条记录: docker search redis --limit 3

# -f: 过滤查询
stars=150: 查询收藏数大于150的镜像
例: docker search redis -f stars=150

# --no-trunc: 不截断查询: docker search redis -f stars=150 --no-trunc
2.7、删除和清理镜像
在docker中,删除镜像主要使用rmi子命令,清理镜像主要使用prune子命令
docker rmi [镜像ID|[镜像名称:版本号]]

docker images  # 查看镜像
# REPOSITORY                                         TAG                     IMAGE ID            CREATED             SIZE
# redis                                              latest                  74d107221092        12 days ago         104MB
# registry.cn-hangzhou.aliyuncs.com/alvinos/swoole   hyperf-php72-swoole45   560f3f47e448        3 months ago        85.9MB

docker rmi 74d107221092
# Untagged: redis:latest
# Untagged: redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
# Deleted: sha256:74d107221092875724ddb06821416295773bee553bbaf8d888ababe9be7b947f
# Deleted: sha256:d951b383737320b4e1ac7f9bb63f3919bcf25363ccb59fbb52a41e45ba70ffdd
# Deleted: sha256:d3b2581a1c92973ee9a41fc00e5628047ce7e644a66240fb859b38831bd525b4
# Deleted: sha256:a447231da503a58432b4d7409980139206fdf398fbde189d8a7229dd0663f472
# Deleted: sha256:f786204ca260bcaef3d47ecad10821878028239072c65ceb2a1f212f275f9367
# Deleted: sha256:b68afce5f52461f79be59806be00e43ea95152a0358b8dc5de9ac3f486a70d7e
# Deleted: sha256:f5600c6330da7bb112776ba067a32a9c20842d6ecc8ee3289f1a713b644092f8

# -f: 强制删除
如果该镜像正在使用中,强制删除,实际上是删除标签

# 清理镜像
docker image prune [参数]
-a: 清理所有的(未被使用)镜像
2.8、保存容器为镜像
docker commit [容器ID] [参数]

-a: 作者信息
-m: 提交信息
-p: 提交时,暂停容器运行

# 以redis为例,启动
docker run -d redis  

# 查看
docker ps
# CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
# e9e1148d5369        redis               "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        6379/tcp            festive_dewdney

# 保存容器为镜像,并指定名称和版本号
docker commit -a "allen" -m "详细信息" e9e1148d5369 redis:v1

# 此时查看,第一条就是我们刚才创建保存的
docker images
# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# redis               v1                  b528540b5b79        7 seconds ago       104MB
# redis               latest              74d107221092        12 days ago         104MB

3、容器

3.1、查看容器
查看正在运行的容器
docker ps

查看所有容器
docker ps –a

查看最后一次运行的容器
docker ps –l

查看停止的容器
docker ps -f status=exited
3.2、创建与启动容器
创建容器常用的参数说明:

创建容器命令: docker run
注意: docker run  镜像 如果本地没有,会先pull,再run

创建: docker create --name=xxx redis
    docker create --name=test-container centos:centos7 ps -A
启动: docker start test-container
    容器一直运行的原因
    	(1)它有一条前台进程,一直在运行
        (2)以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
        (3)如果该命令结束,该容器也就结束了
-i: 表示运行容器
-t: 表示容器启动后会进入其命令行,加入这两个参数后,容器创建就能登录进去,即分配一个伪终端
--name: 为创建的容器命名
-v: 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射,注意: 最好做目录映射,在宿主机上做修改,然后共享到容器上
-d: 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
-p: 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
3.2.1、交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

退出当前容器
exit
3.2.2、守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签

登录守护式容器方式
docker exec -it 容器名称 (或者容器ID)  /bin/bash
3.3、停止与启动容器
停止容器
docker stop 容器名称(或者容器ID)

启动容器
docker start 容器名称(或者容器ID)
3.4、文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录

也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
3.5、目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器
创建容器 添加-v参数 后边为 宿主机目录:容器目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

如果你共享的是多级的目录,可能会出现权限不足的提示
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
3.6、查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID) 

也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
3.7、删除容器
删除指定的容器
docker rm 容器名称(容器ID)

4、应用部署

# 在容器内部署mysql
# -e表示环境变量
docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
        
# 在容器内部署redis
docker run -di -p 6377:6379 redis:latest
        
# 在容器内部署nginx
docker run -di --name=mynginx -p 8080:80 nginx
4.1、在容器内部署redis,把配置文件和数据目录映射到宿主机
1、mkdir /reids /redis/conf /redis/data
2、vim /redis/conf/redis.conf
# 配置文件
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456  # 指定redis登录密码
3、创建并运行容器,目录映射
docker run -p 6378:6379 --name redis_6379 -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -di redis redis-server /etc/redis/redis.conf
4、本地window机器上远程连接到了docker里的redis
5、cmd窗口下
   redis-cli -h 101.133.225.166 -p 6378
6、认证
  auth 123456
7、写入数据
  set name allen
8、保存数据
  save或者是bgsave
9、在宿主机的/redis/data路径下就能看到一个文件
10、不管多少次重启redis容器,数据都还在
11、原来的redis容器没了,按照第三步再启动一遍数据都还在
4.2、基于python3.6构建自己的镜像启动容器
1、启动一个python容器
   docker run -di --name=mypython python:3.6
2、进入容器中安装django
    docker exec -it mypython /bin/bash
    mkdir /project
    pip install django==1.11.1
3、把宿主机项目拷贝到容器内部
   docker cp /opt/data/django_test mypython:/project
4、把容器做成镜像
   docker commit mypython mydjango
5、基于自己做的镜像运行容器
    docker run -id --name=mydjango -p 8088:8088  mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088

5、迁移与备份

把镜像打包成压缩包
docker save -o xxx.tar 镜像名称

把压缩包恢复为镜像
docker load -i xxx.tar

6、dockerfile

6.1、定义
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

1、对于开发人员: 可以为开发团队提供一个完全一致的开发环境
2、对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
3、对于运维人员: 在部署时可以实现应用的无缝移植
6.2、dockerfile指令
命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
6.3、使用脚本创建镜像
6.3.1、创建目录
mkdir –p /usr/local/dockerdjango
6.3.2、创建文件Dockerfile(vi Dockerfile)
# 依赖镜像名称和ID
FROM python:3.6
# 指定镜像创建者信息
MAINTAINER TEST
# 切换工作目录
WORKDIR /usr
RUN mkdir  /usr/local/mydocker
RUN pip install==1.11.9
ENV PATH $JAVA_HOME/bin:$PATH
6.3.3、执行命令构建镜像
docker build -t='django1.11.9' .

注意后边的空格和点,不要省略
6.3.4、查看镜像是否建立完成
docker images
6.4、完整演示
1、定义Dockerfile
vim Dockerfile,内容如下:
FROM python:3.6
MAINTAINER allen
EXPOSE 8080
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
VOLUME ['/home']
WORKDIR /home/django_test
CMD python manage.py runserver 0.0.0.0:8080

2、通过dockerfile构建出镜像
docker build -t="mydjango_1.11.11" .

3、启动容器
docker run --name=mydjango_test -p 8888:8080 -v /root/dj_test:/home/django_test -id mydjango_1.11.11

4、在浏览器中访问
http://192.168.12.80:8888/

7、Docker私有仓库

7.1、私有仓库搭建与配置
7.1.1、拉取私有仓库镜像
docker pull registry
7.1.2、启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
7.1.3、打开浏览器 输入地址http://ip地址:5000/v2/_catalog看到{“repositories”:[]} 表示私有仓库搭建成功并且内容为空
7.1.4、修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出
{"insecure-registries":["ip地址:5000"]} 
此步用于让 docker信任私有仓库地址
7.1.5、重启docker 服务
systemctl restart docker
7.2、镜像上传至私有仓库
7.2.1、标记此镜像为私有仓库的镜像
docker tag django2.0 ip地址:5000/django2.0
7.2.2、再次启动私服容器
docker start registry
7.2.3、上传标记的镜像
docker push ip地址:5000/django2.0

你可能感兴趣的:(python,docker,linux,python)