概述
让开发人员最头疼的麻烦事之一就是环境配置了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?
用户必须确保的是:
- 操作系统的相同
- 各种平台库和组件的安装
- 例如python依赖包,环境变量等
如何一些低版本的依赖模块和当前环境不兼容,那就头疼了。。。。。
如果环境配置这么痛苦的话,换一台机器,就得重新配置一下,那么在安装软件的时候,带着原始环境一模一样的复制过来。
以上问题的解决方法有两个:
- 解决方案一 虚拟机定制操作系统模板, 例如vmware esxi 定制一个 centos镜像板块,我在这模板中定制我的功能,安装vim 安装 python3 安装 django等 。 通过镜像模块安装系统,也可以解决环境依赖的问题。但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容
- 解决方案二 Linux容器,Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离。
服务器环境分为三个阶段: 开发->测试->上线
- 开发环境(本地测试代码环境):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告。
- 测试环境( 即将上线服务器):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。
- 生产环境(线上服务器):是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。
三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。
通俗一点就是:
1:开发环境:项目尚且在编码阶段,我们的代码一般在开发环境中 不会在生产环境中,生产环境组成:操作系统 ,web服务器 ,语言环境。 php 。 数据库 。 等等
2:测试环境:项目完成测试,修改bug阶段
3:生产环境:项目数据前端后台已经跑通,部署在阿里云上之后,有客户使用,访问,就是网站正式运行了
进一步详细学习 >>> 点击
- docker基础入门
- docker网络
Docke用场景
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。 Docker 使用 Google 公司推出的 Go 语言 进行开发实现。 docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。 docker的接口相当简单,用户可以方便的创建、销毁容器。 docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。 程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。
web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他应用
Docker和虚拟解释器的区别是:
- virtualenv是python解释器的虚拟环境,和操作系统无关,在机器上可以配置多个python解释器
- Docker是在物理操作系统上的一个环境隔离(虚拟环境)
Docker容器是操作系统级别的,虚拟解释器是软件运行环境.
服务器环境发展过程
第一代:服务器+ centos
第二代:
个人 服务器 + windows+vmware workstation(学习版)+centos7 机器垃圾,只能安装10个以内的虚拟机 + django应用
企业 服务器 + vmware esxi(企业版虚拟化)+linux
+centos
+redhat
+suse
第三代: 服务器 + opnstatck 云虚拟化
第四代:服务器 + vmware esxi + docker + django应用
我们个人学习 笔记本+vmware +centos+docker +django
我之前企业应用如下:
dell poweer ege R720
实体服务器,26台,托管在上海世纪互联机房托管中心
还有自建机房(5台内网服务器)
通过R720实体服务器,通过vmware esxi(支持windows,linux)
虚拟化出280+的linux操作系统
100+redhat
100+centos
Docker VS 传统虚拟机
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
docker三大概念
容器三大基本概念,docker整个生命周期就是这三个概念
- 镜像 image Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
- 容器 container
- 仓库 repository 存放镜像文件的地方,我可以去公网去,下载镜像
Centos安装Docker
方法一 编译安装,源码安装
方法二 yum安装
如果网速太慢,你可以选择阿里云的源,缺点就是版本低,选择用aliyun的yum源,docker就存在epel源中
如果网速够快,或者在公司中,一定要装官方源配置docker的官方源,一定是官方的最好啊
请遵循官方安装方式!!!
https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script
#由于配置不了官方的docker仓库,咱们选择阿里云
1. 安装docker服务端, 使用yum安装可一次性将Docker及其依赖软件全部安装
yum install docker* docker-* -y #安装
yum remove docker-* # 卸载
安装过程, 注意中间需要自己输入一次 y :
[root@MiWiFi-R4CM-srv /]# yum install docker* docker-* -y 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile ****** 事务概要 ======================================================================= 安装 13 软件包 (+31 依赖软件包) 升级 ( 7 依赖软件包) 总计:75 M 总下载量:66 M Is this ok [y/d/N]: y #注意此处需要自己输入 y ******************************************************************* 作为依赖被升级: libsemanage.x86_64 0:2.5-14.el7 ******* setools-libs.x86_64 0:3.3.8-4.el7 完毕!
2. 配置阿里云镜像加速器
docker安装完毕, 当使用 docker pull 命令下载镜像时, 原配下载很慢, 容易下载失败, 此时可以配置加速器快速下载.
配置方法如下:
点击
[root@MiWiFi-R4CM-srv sysconfig]# vim /etc/docker/daemon.json [root@MiWiFi-R4CM-srv sysconfig]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } [root@MiWiFi-R4CM-srv sysconfig]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: http://docs.docker.com 3月 30 22:57:14 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 22:57:28 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 22:57:41 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 22:58:06 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 22:59:56 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 23:02:24 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 23:02:24 MiWiFi-R4CM-srv systemd[1]: Stopping Docker Application .... 3月 30 23:02:24 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 23:02:24 MiWiFi-R4CM-srv dockerd-current[55187]: time="2020-03-30T... 3月 30 23:02:25 MiWiFi-R4CM-srv systemd[1]: Stopped Docker Application C.... Hint: Some lines were ellipsized, use -l to show in full. [root@MiWiFi-R4CM-srv sysconfig]# systemctl start docker [root@MiWiFi-R4CM-srv sysconfig]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since 一 2020-03-30 23:06:34 CST; 2s ago Docs: http://docs.docker.com Main PID: 57956 (dockerd-current) Tasks: 26 CGroup: /system.slice/docker.service ├─57956 /usr/bin/dockerd-current --add-runtime docker-runc=/usr... └─57966 /usr/bin/docker-containerd-current -l unix:///var/run/d... 3月 30 23:06:32 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:33 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:33 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:33 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv dockerd-current[57956]: time="2020-03-30T... 3月 30 23:06:34 MiWiFi-R4CM-srv systemd[1]: Started Docker Application C.... Hint: Some lines were ellipsized, use -l to show in full. [root@MiWiFi-R4CM-srv sysconfig]# docker pull centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos 8a29a15cefae: Pull complete Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700 Status: Downloaded newer image for docker.io/centos:latest
2. 启动docker
systemctl start docker # 启动docker容器
[root@MiWiFi-R4CM-srv /]# systemctl start docker
systemctl status docker # 查看docker容器运行状态
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
docker运行后, 可查询运行状态
3.查看docker是否正确启动
docker version
4.简单使用docker
docker images #查看镜像
docker run 镜像名/镜像id(可以写前三位) #运行一个docker容器实例立即退出, 但是会有容器运行记录
docker run -it 镜像名 # 运行并进入一个容器
docker ps #查看docker进程
docker ps -a #查看所有运行过的docker容器记录
查看镜像并运行容器:
运行后发现容器是一个没有vim的centos系统
退出容器使用: exit
方法三. rpm安装
此安装麻烦,一般不用
Docker常用命令:
增 增加容器记录,启动容器
docker run 镜像id/镜像名 #运行创建一个容器container实例
docker run -it centos #此命令会 进入到容器空间内,进入到容器的centos中
-i 交互式界面
-t 是开启一个终端
docker run -it --rm ubuntu #运行一个乌班图容器,并且在退出是,删除容器运行记录
docker run centos
#直接运行这个centos镜像,会生成一个容器记录
#此时就会生成一个容器记录,但是容器中并没有任何的后台程序,因此直接就挂掉
# 你会发现,容器死活不生成,docker ps 看不到记录,
docker run -d centos /bin/sh -c "while true;do echo hello s14 docker~~~~; sleep 1;done"
#一定会生成一个容器记录
#docker ps 能不能看到记录?
-d 参数是 后台运行
/bin/sh 调用shell解释器
-c 指明一段shell语法
docker pull centos #下载docker的镜像
删
docker rm 容器id #docker rm删除的是已经停止的容器id
docker rmi 镜像id #删除一个镜像记录
docker rm `docker ps -aq` # 一次性删除所有容器id记录
` ` #反引号是取命令的运行结果
docker rmi `docker images -aq` #一次性删除所有镜像记录
改
docker commit #提供容器记录,为新的镜像
docker stop 容器id #停止正在运行的容器
docker start 容器id #启动一个关闭中的容器
#导出镜像
docker save centos > /opt/centos.tar.gz #导出docker镜像至本地
#导入镜像
docker load < /opt/centos.tar.gz
#通过--name参数给容器记录,加上别名
docker run --name s14hehe -d centos /bin/sh -c "while true;do echo hello s14 docker~~~~; sleep 1;done"
#进入正在运行的容器
docker exec -it c49 /bin/bash
-it 交互式的操作终端
/bin/bash使用shell解释器,只有在redhat,centos系统中,才能用/bin/bash
查
docker image ls #查看镜像记录
docker images #查看镜像记录
docker ps #查看容器记录 ,只能查看到正在运行中的容器
#正在运行中的容器,代表,容器后台一定有个进程在运行
docker ps -a #查看停止的和在运行的容器记录
docker container ls -a #等同于docker ps -a
docker logs -f 容器id #查看正在运行中的 容器内日志
-f 不间断打印
常用镜像和容器命令总结:
docker使用命令回顾: 镜像 docker image ls docker images docker pull 镜像名 #docker仓库,dockerhub docker push 镜像名 #把本地的镜像推送到 dockerhub仓库 docker search 镜像名 docker rmi 删除镜像 docker version #查看docker版本,查看到server 和client两个端 systemctl start docker #启动docker docker save 镜像名 > /data/centos.tar.gz #导出镜像 docker load < /data/centos.tar.gz #导入镜像 docker run 镜像名 #运行镜像文件,产生一个容器实例 容器 docker start 容器id docker stop 容器id docker exec -it 容器id #进入正在运行的容器 -i 交互式操作 -t 开启一个终端 docker run 镜像名 #创建容器实例 docker rm 容器id #删除容器记录,必须提前docker stop 容器id ,只能杀死已经停止的容器 docker ps #查看容器正在运行记录 docker ps -aq #显示所有容器记录的id号 -a 显示所有容器记录 -q 显示容器id docker rm `docker ps -aq` #一次性删除所有容器记录 docker container ls #查看容器正在运行记录 docker commit 容器id记录 #提交这个容器,创建一个新的镜像 docker logs #查看容器运行日志 -f #不间断打印容器日志 docker port #查看容器的端口映射关系(外部访问到容器内的端口) docker run -d centos -P -d 后台运行 -P 随机映射端口 -p 9000(宿主机):5000(容器内) --name 给创建的容器记录,添加别名
外部访问容器
通过-P参数进行端口映射
#运行一个web容器实例
1.下载镜像
docker pull training/webapp
2.运行镜像,产生容器记录
docker run -d -P 6fa python app.py
-d 后台运行
-P 将容器内的5000端口随机映射到宿主机的一个端口
docker port 容器id
[root@node1 /opt/redis-4.0.10/src 16:00:41]#docker port ebb7
5000/tcp -> 0.0.0.0:32768
外部访问容器运行示例:
liunx系统端:
[root@MiWiFi-R4CM-srv /]# docker pull training/webapp Using default tag: latest Trying to pull repository docker.io/training/webapp ... latest: Pulling from docker.io/training/webapp e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d Status: Downloaded newer image for docker.io/training/webapp:latest [root@MiWiFi-R4CM-srv /]# docker run -d -P 6fa python app.py a0361209a6367028f39daa2f2481cf447f16fa8db1d3be194c65d80e554d6e07 [root@MiWiFi-R4CM-srv /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0361209a636 6fa "python app.py" 10 seconds ago Up 5 seconds 0.0.0.0:32768->5000/tcp awesome_engelbart [root@MiWiFi-R4CM-srv /]# docker port a03 5000/tcp -> 0.0.0.0:32768 [root@MiWiFi-R4CM-srv /]#
浏览器输入地址运行:
Docker镜像加速器
#执行命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#其实就是更改了,docker的一个仓库源
[root@node1 /opt/redis-4.0.10/src 14:48:26]#cat /etc/docker/daemon.json
{
"registry-mirrors": [
"http://95822026.m.daocloud.io"
],
"insecure-registries": []
}
配置linux的 Docker 镜像站:
[root@MiWiFi-R4CM-srv /]# cat /etc/docker/daemon.json {} [root@MiWiFi-R4CM-srv /]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io docker version >= 1.12 {"registry-mirrors": ["http://95822026.m.daocloud.io"],} Success. You need to restart docker to take effect: sudo systemctl restart docker [root@MiWiFi-R4CM-srv /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"],} # 发现docker不能启动 [root@MiWiFi-R4CM-srv /]# systemctl start docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. [root@MiWiFi-R4CM-srv /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"],} [root@MiWiFi-R4CM-srv /]# vim /etc/docker/daemon.json # 直接修改/etc/docker/daemon.json [root@MiWiFi-R4CM-srv /]# cat /etc/docker/daemon.json { "registry-mirrors": [ "http://95822026.m.daocloud.io" ], "insecure-registries": [] }
创建提交自定义的镜像
(自己修改了容器记录,提交成一个新的镜像,可以发给别人使用)
#需求是?
1.默认的centos镜像,没有vim
2.我们自己run一个容器记录,安装vim,然后提交成新的镜像文件
docker commit 24c1ef3f8da8 s14/centos-vim
3.查看新的镜像记录
docker images
s14/centos-vim latest 01b0298ec5b0 7 seconds ago 327 MB
4.可以通过新的带有vim的镜像运行容器记录,通过此方法可以解决环境难配置的问题
docker run -it s14/centos-vim /bin/bash
1.我们进入交互式的centos容器中,发现没有vim命令
docker run -it centos
2.在当前容器中,安装一个vim
yum install -y vim
3.安装好vim之后,exit退出容器
exit
4.查看刚才安装好vim的容器记录
docker container ls -a
5.提交这个容器,创建新的image
docker commit 059fdea031ba chaoyu/centos-vim
6.查看镜像文件
[root@master /home]docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
带有vim的centos容器创建过程示例:
[root@MiWiFi-R4CM-srv /]# docker run -it centos [root@046f946b55b1 /]# vim bash: vim: command not found [root@046f946b55b1 /]# yum install -y vim Failed to set locale, defaulting to C.UTF-8 ************** Complete! [root@046f946b55b1 /]# vim [root@046f946b55b1 /]# exit exit [root@MiWiFi-R4CM-srv /]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 046f946b55b1 centos "/bin/bash" About a minute ago Exited (0) onds ago heuristic_brattain f15d93238bab ubuntu "/bin/bash" 20 minutes ago Exited (0) utes ago naughty_saha 4ada6ebffeb8 centos "/bin/sh -c 'while..." 30 minutes ago Exited (137inutes ago lucid_minsky 7ae1976783eb centos "/bin/bash" 42 minutes ago Exited (0) utes ago heuristic_turing [root@MiWiFi-R4CM-srv /]# docker commit 046f946b55b1 mycontainer/centos-vim sha256:4ebfb52e8f614cbe313c962b9f3f199805f1a1b90a8d3d33f4d2fc4dd843ab81 [root@MiWiFi-R4CM-srv /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycontainer/centos-vim latest 4ebfb52e8f61 16 seconds ago 301 MB docker.io/ubuntu latest 4e5021d210f6 9 days ago 64.2 MB docker.io/centos latest 470671670cac 2 months ago 237 MB [root@MiWiFi-R4CM-srv /]#
利用dockerfile定制镜像
镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。
镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
脚本的概念就是,将你想做的事,写入到一个文件中,然后执行这个文件,就是执行一个脚本
需求: 定制一个拥有nginx和vim的centos镜像文件
只需要如下三条命令, 就可以利用
Dockerfile脚本
定制entos-vim-nginx镜像文件:FROM centos RUN yum install vim -y RUN yum install nginx -y
定制镜像示例: 打包flask程序与dockerfile
步骤1: 准备工作
准备在/data/mydocker文件夹下完成本示例,准备工作如下:
1. 创建工作目录及文件
[root@MiWiFi-R4CM-srv data]# cd /data
[root@MiWiFi-R4CM-srv data]# mkdir mydocker
[root@MiWiFi-R4CM-srv data]# cd mydocker/
[root@MiWiFi-R4CM-srv mydocker]# ll
总用量 0
[root@MiWiFi-R4CM-srv mydocker]# touch Dockerfile
[root@MiWiFi-R4CM-srv mydocker]# touch myflask.py
[root@MiWiFi-R4CM-srv mydocker]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月 31 09:46 Dockerfile
-rw-r--r--. 1 root root 0 3月 31 09:48 myflask.py
2. 进入容器环境准备网络工具,准备好后退出
[root@MiWiFi-R4CM-srv mydocker]# docker run -it centos
[root@73fc77f24873 /]# yum install net-tools -y
****
Installed:
net-tools-2.0-0.51.20160912git.el8.x86_64
Complete!
[root@73fc77f24873 /]# exit
exit
[root@MiWiFi-R4CM-srv mydocker]#
步骤2. 准备一个flask的python代码
[root@MiWiFi-R4CM-srv mydocker]# vim myflask.py
[root@MiWiFi-R4CM-srv mydocker]# cat myflask.py
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "hello docker, this is my 1 Dockerfile test!"
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)
步骤3. 准备好所有需要的文件CentOS-Base.repo和epel.repo, 方便下载.
两个文件可以在系统中查找复制到/data/mydocker下
[root@MiWiFi-R4CM-srv /]# find / -name CentOS-Base.repo
/etc/yum.repos.d/repo_back/CentOS-Base.repo
/etc/yum.repos.d/CentOS-Base.repo
[root@MiWiFi-R4CM-srv mydocker]# find / -name epel.repo
/etc/yum.repos.d/epel.repo
[root@MiWiFi-R4CM-srv mydocker]# ls
CentOS-Base.repo Dockerfile epel.repo myflask.py
步骤4: 准备Dockerfile文件
[root@MiWiFi-R4CM-srv mydocker]# cat Dockerfile
FROM centos
LABEL maintainer="Chao Wang<ChaoWang@163.com>"
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-pip -y
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
COPY myflask.py /app/
WORKDIR /app
EXPOSE 8080
CMD ["python","myflask.py"]
Dockerfile解释:
- 1.引入一个centos镜像,为基础镜像
- 2.作者注释信息
- 3.添加本地的两个yum文件,到容器的/etc/yum.repos.d/底下
- 4.清空yum缓存
- 5.yum安装pip工具
- 6.pip安装flask模块,指定清华源
- 7.拷贝本地的flask代码,到容器的/app/目录下
- 8.切换工作目录,到/app底下
- 9.暴露容器的8080端口,然后在运行镜像时候,加上-p参数,指定端口映射
- 10.执行命令,运行flask
步骤5 构建docker镜像文件
docker build -t yuchao163/s14-flask-docke .
#构建当前目录的Dcokerfile,然后构建出一个名为yuchao163/s14-flask-docker 这个的镜像文件
-t tag参数,给镜像加上标记名
dockerhub账户名:yuchao163dockerhub账户名/镜像名 #是为了后面讲docker镜像,推送到dockerhub
步骤6 查看镜像是否构建完成
docker images
步骤7 运行这个镜像文件,产生容器实例
docker run -p 9000:8080 -d 43d
-p 映射9000端口到容器的8080
-d 后台运行
43d 镜像id
此时可以在浏览器中访问
步骤8. 查看已经运行的docker实例
docker ps
发布自己的docker镜像到Docker hub
学习dockerhub,发布自己的docker镜像
1.我可以先下载其他人的docker镜像
docker pull yuchao163/hello-world-docker
2.上传自己的docker镜像
docker login #登录自己的docker hub账号 ,输入密码
#docker就会有你自己的dockerhub账号信息 xxxxxx
3.更改docker镜像的名字,也就是加上一个tag标记
docker tag s14/centos-vim xxxxxxx/s14-centos-vim
docker tag 现有镜像名字 dockerhub账户名/新的镜像名
4.登录后可以推送镜像文件,此时推送给的是自己的yuchao163账号仓库下
docker push xxxxxx/hello-docker
5.登录https://hub.docker.com/查看自己推送的公网镜像
Docker仓库(repository)
构建公司私有docker仓库,其实就是搭建一个api服务器,通过api可以下载镜像
步骤1.下载docker官方提供的私有仓库镜像
docker pull registry
步骤2. 查看镜像
docker images
步骤 3. 启动一个私有仓库容器
docker run -d
-p 5000:5000
-v /opt/data/registry:/var/lib/registry
registry
步骤 4. 此时可以检查容器进程
docker ps
步骤 5. 此时私有仓库就打开了5000端口,通过端口映射,访问宿主机的5000端口,查看是否通信
yum install telnet -y # telnet工具可以检查端口通信
telnet 127.0.0.1 5000 # 检测5000端口是否通信
[root@MiWiFi-R4CM-srv mydocker]# yum install telnet -y 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile ****** 已安装: telnet.x86_64 1:0.17-64.el7 完毕! [root@MiWiFi-R4CM-srv mydocker]# telnet 127.0.0.1 5000 Trying 127.0.0.1... Connected to 127.0.0.1. ## 说明通信正常 Escape character is '^]'. [root@MiWiFi-R4CM-srv mydocker]# telnet 192.168.31.183 5000 Trying 192.168.31.183... Connected to 192.168.31.183. Escape character is '^]'. [root@MiWiFi-R4CM-srv mydocker]# telnet 192.168.31.183 4000 Trying 192.168.31.183... telnet: connect to address 192.168.31.183: Connection refused # 通信失败
如果通信正常, 浏览器地址可以访问端口获取json数据: http://192.168.119.10:5000/v2/_catalog
步骤 6. 修改本地镜像的tag标签,标注我要往哪push镜像
docker tag docker.io/centos 192.168.31.183:5000/mycangku
执行命令后可获取新的镜像:
步骤 7. 修改docker配置,允许非安全的传输方式
1.vim /etc/docker/daemon.json,写入信息,私有仓库地址,都得改成自己的
{"registry-mirrors": ["http://95822026.m.daocloud.io"],
"insecure-registries":["192.168.31.183:5000"]
}
2.修改docker.server
vim /lib/systemd/system/docker.service
#写入如下信息,请在[service]中写入
[Service]
EnvironmentFile=/etc/docker/daemon.json
修改示例:
[root@MiWiFi-R4CM-srv mydocker]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://q1fet2ok.mirror.aliyuncs.com"], "insecure-registries": ["192.168.31.183:5000"] } [root@MiWiFi-R4CM-srv mydocker]# cat /lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.com After=network.target Wants=docker-storage-setup.service Requires=docker-cleanup.timer [Service] EnvironmentFile=/etc/docker/daemon.json Type=notify NotifyAccess=main ***************************
步骤 8. 重启docker服务,使得生效
systemctl daemon-reload #重新加载docker配置文件
systemctl restart docker #重启docker服务
步骤9. 重启docker服务,会停止容器,因此要再次启动
docker ps -a
docker start b23bcfe42e80 #启动这个私有仓库容器
[root@MiWiFi-R4CM-srv mydocker]# docker start 3df1610b892d 3df1610b892d
启动私有仓库容器需要找到容器ID
步骤10. 推送本地镜像到 私有仓库 192.168.31.183:5000
docker push 192.168.31.183:5000/mycangku
[root@MiWiFi-R4CM-srv mydocker]# docker push 192.168.31.183:5000/mycangku
The push refers to a repository [192.168.31.183:5000/mycangku]
0683de282177: Pushed
步骤11. 此时访问api接口,查看私有仓库的数据
http://192.168.12.96:5000/v2/_catalog
步骤12. 此时,可以docker pull 192.31.183:5000/mycangku 下载镜像
docker pull 192.168.31.183:5000/mycangku
私有仓库镜像删除下载实验:
我们先删除该镜像,在进行下载:
root@MiWiFi-R4CM-srv mydocker]# docker rmi 192.168.31.183:5000/mycangku [root@MiWiFi-R4CM-srv mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 994f9a251511 3 hours ago 238 MB mycontainer/centos-vim latest 4ebfb52e8f61 13 hours ago 301 MB docker.io/ubuntu latest 4e5021d210f6 10 days ago 64.2 MB docker.io/registry latest 708bc6af7e5e 2 months ago 25.8 MB docker.io/centos latest 470671670cac 2 months ago 237 MB docker.io/training/webapp latest 6fae60ef3446 4 years ago 349 MB [root@MiWiFi-R4CM-srv mydocker]# docker pull 192.168.31.183:5000/mycangku Using default tag: latest Trying to pull repository 192.168.31.183:5000/mycangku ... latest: Pulling from 192.168.31.183:5000/mycangku Digest: sha256:9e0c275e0bcb495773b10a18e499985d782810e47b4fce076422acb4bc3da3dd Status: Downloaded newer image for 192.168.31.183:5000/mycangku:latest
下载后又有了
docker的数据集挂载功能
-v 参数 挂载宿主机的文件:容器内的文件夹
-v /opt/data:/opt/s14/
docker run -p 8000:8080 -v /opt/s14:/opt/data/ -d 43d
启动容器,通过-v参数挂载
挂载容器内的/opt/data/文件夹,其实访问的是宿主机的/opt/s14/
-p 7000:5000
简单应用测试:
[root@MiWiFi-R4CM-srv /]# docker run -it -v /mytest/aaa:/mytest/ccc centos [root@c8fc40a13058 /]# cd /mytest [root@c8fc40a13058 mytest]# ls ccc [root@c8fc40a13058 mytest]# cd ccc/ [root@c8fc40a13058 ccc]# touch jjj.txt [root@c8fc40a13058 ccc]# ls jjj.txt [root@c8fc40a13058 ccc]# exit exit [root@MiWiFi-R4CM-srv /]# ll /mytest 总用量 0 drwxr-xr-x. 2 root root 21 3月 31 14:53 aaa [root@MiWiFi-R4CM-srv /]# ll /mytest/aaa 总用量 0 -rw-r--r--. 1 root root 0 3月 31 14:53 jjj.txt [root@MiWiFi-R4CM-srv /]# [root@MiWiFi-R4CM-srv /]# docker run -it centos [root@7ed885a420a7 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@7ed885a420a7 /]# cd /mytest bash: cd: /mytest: No such file or directory [root@7ed885a420a7 /]# [root@MiWiFi-R4CM-srv /]# docker run -it -v /mytest/aaa:/mytest/ccc centos [root@d056b2615555 /]# ls bin etc lib lost+found mnt opt root sbin sys usr dev home lib64 media mytest proc run srv tmp var [root@d056b2615555 /]# ls /mytest/ccc jjj.txt [root@d056b2615555 /]#
测试发现:
- 如果没有目录, 执行命令后会自己创建
- 启动容器后, 容器可以和宿主机对挂载目录共享操作
- 如果退出容器,则挂载结束,再次进入容器时
- docker run -it centos 没有之前的挂载效果
- docker run -it -v /mytest/aaa:/mytest/ccc centos 仍然有之前的挂载效果
Docker网络
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
- 端口映射允许外部访问容器
- --link 容器互联
- 容器桥接网络
最后
以上就是快乐信封为你收集整理的Linux系统 09 python环境配置09 之 DockerDocke用场景服务器环境发展过程Docker VS 传统虚拟机docker三大概念Centos安装Docker Docker常用命令: 外部访问容器 Docker镜像加速器 创建提交自定义的镜像利用dockerfile定制镜像发布自己的docker镜像到Docker hubDocker仓库(repository) docker的数据集挂载功能Docker网络的全部内容,希望文章能够帮你解决Linux系统 09 python环境配置09 之 DockerDocke用场景服务器环境发展过程Docker VS 传统虚拟机docker三大概念Centos安装Docker Docker常用命令: 外部访问容器 Docker镜像加速器 创建提交自定义的镜像利用dockerfile定制镜像发布自己的docker镜像到Docker hubDocker仓库(repository) docker的数据集挂载功能Docker网络所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复