docker学习

docker入门学习

docker是什么?

1.linux下容器技术有很多,docker是做的最杰出的一款

2.docker能够支持阿里双十一,可见安全和并发都没问题

3.docker容器很容易被大规模创建

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现。
docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。
docker的接口相当简单,用户可以方便的创建、销毁容器。
docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。
程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了

4.docker能够解决什么问题?

ocke用场景

web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他应用

5.每一个docker容器,安装一个app

6.docker如同在os的进程上,接着一个马甲,其实还是运行在一个单独linux系统上

7.让开发人员最头疼的就是,环境配置问题,运行一个crm,可能要解决很多的依赖 关系,才能运行,

保证操作系统一致性,你本地是windows,服务器可能是centos/ubuntu

你本地开发的是python3,也得保证服务器是python3

还得解决pip依赖包

8.有没有一种办法,能把本地的开发代码,全部切换到服务器上呢?

解决办法1:vmware 虚拟机模板克隆

解决办法2:docker容器技术

将你的应用程序,和代码,全部打包在一个系统镜像内,(docker image 容器镜像),镜像就是一个操作的压缩文件。

基于系统镜像可以运行操作系统

基于docker镜像,运行出容器镜像

如果开发,把crm代码,和pip3程序的依赖,全部打包在一个镜像内

9.docker能够保证服务器的环境一致性

10.docker的生命周期

基于镜像,安装出系统

基于docker镜像,运行出实例

容器:就像类的实例化

镜像:就像class

 

docker的三大概念

容器:container 基于镜像,运行出的容器实例

镜像:image 电脑城,老板卖的光盘,只要系统环境一致性

仓库:存放镜像的地方

 

#托管代码的平台,叫做GitHub

#托管docker镜像的平台,叫做docker hub

 

配置一个人docker加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

把配置文件逗号去掉:vim /etc/docker/daemon.json

重启docker:sudo systemctl restart docker

 

docker的安装方式:

1.yum安装,必须指定yum源,yum源大致分为centos官方的源,阿里云这样的第三方源,官方源(生产环境配置它最正确)

获取docker社区版

社区ce缩写

企业版是EE缩写

官方教程如下,最正确安装docker姿势

1.卸载旧版本
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-selinux \
                docker-engine-selinux \
                docker-engine

2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

sudo yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

3.安装docker社区版
sudo yum install docker-ce
4.启动关闭docker
systemctl start docker

2.选择阿里云的安装方式配置好阿里云yum源

安装:yum install docker-server docker 或yum install docker -y

3.启动docker服务端

启动:systemctl start docker 查看状态:systemctl status docker

4.学习docker命令

开发人员需要管理,容器的启停,创建,足以

对docker容器,和镜像的增删改查

 

获取一个docker镜像,获取一个基础的ubuntu镜像

获取一个hello-world镜像

docker search hello-world #搜索docker镜像

docker pull hello-world # 下载镜像,就如同骑车去电脑城买光盘,目的为了获取一个镜像文件

#基于镜像,运行出容器实例

docker run hello-world #运行hello-world镜像文件

 

#下载ubuntu的镜像文件,一个微型的ubuntu系统

docker pull ubuntu

#运行ubuntu的系统,基于微型的ubuntu系统,运行一个容器实例,里面是ubuntu微型操作系统

docker run ubuntu

#交互式的运行一个ubuntu系统,可以进行命令交互,并且

docker run -it ubuntu /bin/bash

查看系统:cat /etc/os-release

参数解释

-i交互式的运行

-t开启一个终端 termenl

/bin/bash 就是linux的shell解释器

什么是linux的shell解释器

python解释器是用来解释且执行python代码

shell解释器是用来解释且执行shell代码,我们输入ls cd都是通过shell进行翻译,linux才认识

 

运行一个后台有进程的容器,活着的容器

docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"

参数解释

docker run 运行镜像

-d daemonize 后台运行

centos 镜像名

/bin/sh 指定shell的sh解释器

-c 指定一段shell代码

"while true;do echo hello centos; sleep 1;done" # 是循环,打印hello centos

运行一个自定义名字的容器记录

docker run --name s18foleng -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"

 

 

 

docker rm 容器id前三位

docker rm f3a

一次性删除所有容器记录

docker rm docker ps -aq

删除镜像记录

docker rmi 镜像id

# 删除所有容器记录

docker rmi -f docker images -aq #-f强制删除

 

进入正在运行容器空间内

docker exec -it 容器id /bin/bash

修改docker镜像名字

docker tag 镜像id 新的镜像名

docker tag cc2b20124a01 kevins

 

 

 

#查询当前机器拥有的镜像文件

docker image ls # 列出镜像文件

docker images #同上,版本升级,命令也就升级了

#运行过镜像后,会产生一个容器记录,容器进程的查看

docker ps #查看正在运行的容器记录,容器必须有后台运行的进程,否则容器挂掉

docker ps -a # 显示所有运行过的容器进程记录

 

查询容器内日志信息

docker logs 容器id #一次性打印日志

docker logs -f 容器id #不间断打印容器日志

 

容器创建非常简单,每次创建,都是新的容器记录,和之前没有关系

#基于镜像,可以很随意运行容器实例

 

 

构建自己的docker镜像,提交本地的docker容器

1.运行一个centos基础镜像,默认没有vim,在容器空间内安装vim

docker run -it centos /bin/bash

2.安装vim

yum install vim -y

3.退出容器空间

exit

4.提交这个容器记录,生成一个新的镜像文件

查看容器id:docker ps -a

docker commit 容器id 镜像名

docker commit 9dd7870654a6 kevins/s18-vim

5.导出这个镜像,成为一个压缩文件,我就可以给大家发送下去

docker save 镜像id > /opt/mydocker.tar.gz

docker save cc2b20124a01 > /opt/mydocker.tar.gz

6.导入docker镜像

 docker load < /opt/mydocker.tar.gz 

 

外部访问容器,是在容器空间内,暴露一个端口,供给外部客户去访问

容器内的端口映射

docker run -d -P training/webapp python app.py

#参数解释

-d 后台运行容器

-P 大写p 随机端口映射 宿主机端口:容器内端口

-p 小写p 指定端口映射 8080:8000

training/webapp 这个是镜像的名字

python app.py 容器要执行的命令

指定端口映射,暴露宿主机的7000,指定映射到容器的5000,这个5000是在容器代码内控制

docker run -d -p 7000:5000 training/webapp python app.py

docker run 如果运行不存在的镜像,默认会先去docker pull

启停docker容器

docker start 容器id

docker stop 容器id

 

登陆dockerhub个人主站,托管docker镜像的网址

https://hub.docker.com/

1.下载dockerhub上的镜像

docker pull yunchao163/s13-hello-docker-world

2.在linux登陆docker hub ,然后推送镜像到公网

账号:kevinss

密码:kevinssid

登陆:docker login

3.修改本地镜像的名字,为docker hub的仓库id

docker tag 镜像id dockerhubID/镜像名

4.推送镜像到hub

docker push dockerhubID/镜像名

docker push kevinss/s18-hello-world

 

dockerfile的学习

指令如下

#你的项目依赖什么操作系统,这里就指定什么操作系统
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

#label标签,告诉别人,这个dockerfile谁写的
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"

#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
  Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd     #打印结果应该是/test/demo

#ADD是可以将本地代码,添加到容器空间内
ADD and COPY
ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz / #添加到根目录并解压

WORKDIR /root
ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/ #等同于上述ADD效果

ADD与COPY
  - 优先使用COPY命令
  -ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget

ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
------这里需要稍微理解一下了-------中级知识---先不讲
VOLUME and EXPOSE

dockerfile实战,构建自己的flaks镜像

1.创建文件夹 :mkdir s18dockerfile

cd s18dockerfile文件目录中。建立两个文件

touch Dockerfile

touch s18-Flask.py

在 s18-Flask.py写入

#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
  return "hello docker"
if __name__=="__main__":
  app.run(host='0.0.0.0',port=8080)

2.编写dockerfile

FROM centos #指定centos基础镜像 COPY CentOS-Base.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 COPY epel.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 RUN yum clean all #执行清空yum缓存的命令 RUN yum install python-setuptools -y #想安装python依赖工具 RUN easy_install flask #想让docker自动安装python2的flask模块 COPY s18-Flask.py/opt/ #把本地代码拷贝到容器内的opt目录下 WORKDIR /opt #进入到opt目录下 EXPOSE 8080 #暴露容器8080端口。供给外部宿主机访问 CMD ["python"," s18-Flask.py"] #cmd代表你要执行的命令

3.构建build这个dockerfile

cp /etc/yum.repos.d/CentOS-Base.repo ./

cp /etc/yum.repos.d/epel.repo ./

确保文件都准备好了,如下所示

[root@localhost s18dockerfile]# ls CentOS-Base.repo Dockerfile epel.repo s18-Flask.py

4.构建dockerfile

docker build .

5.通过自己构建的镜像,运行一个flask程序

docker run -d --name flask -p 5555:8080 s18-Flask.py

6.通过浏览器去访问宿主机 5555端口,即可访问flask程序

 

搭建私有仓库

1.搭建一个私有仓库镜像,官方提供的

docker pull registry

2.修改docker的配置文件,让他支持非https的方式推送,安全的方式推送倒私有仓库中

vim /etc/docker/daemon.json

{"registry-mirrors": ["http://95822026.m.daocloud.io"] ,"insecure-registries":["192.168.91.128:5000"]: }

3.修改docker的service配置文件,让他加载/etc/docker/daemon.json

修改如下配置文件

vim /lib/systemd/system/docker.service

只需写入到[service]代码块中如下:

EnvironmentFile=-/etc/docker/daemon.json

4.重启docker的服务

systemctl daemon-reload
systemctl restart docker

5.运行这个镜像,生成一个容器实例

docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry
    # -v  宿主机的文件夹目录映射容器内的文件夹目录
    -p 端口映射
    #--privileged=true  docker容器的安全机制:设置特权级运行的容器

6.推送发到hub

docker push 192.168.91.128:5000/s18-hello-world

7.检查docker私有仓库的api地址,检查json数据

http://192.168.91.128:5000/v2/_catalog

8.尝试下载私有仓库的镜像(在局域网里面下载)

docker pull 192.168.91.128:5000/s18-hello-world

posted @ 2020-01-02 21:29  凯帅  阅读(219)  评论(0编辑  收藏  举报