docker基础

Posted shenjianping

tags:

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

一、docker的概念

1、什么是docker?

docker是一种容器,而容器就是将软件打包成标准化单元,以用于开发、交付和部署,所以docker:

  • 能够自动执行重复性任务
  • 程序运行在虚拟容器里,如同在真实物理机上运行一样
  • 将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器

2、为什么需要docker?

  • 保证环境一致性
  • 提高部署速度
  • 迁移方便

二、docker操作

1、docker安装

#1、卸载旧的的docker
[[email protected] yum.repos.d]# 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、建立yum源安装库
[[email protected] yum.repos.d]#  yum install -y yum-utils \\
>   device-mapper-persistent-data >   lvm2

[[email protected] yum.repos.d]# yum-config-manager \\
>     --add-repo >     https://download.docker.com/linux/centos/docker-ce.repo

#3、安装docker社区版
[[email protected] ~]# yum install docker-ce

#4、启动docker
[[email protected] ~]# systemctl start docker

#5、查看docker版本
[[email protected] ~]# docker version

查看系统中存在的yum源库:

[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# ls
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo  local.repo
CentOS-CR.repo         CentOS-Media.repo      epel.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo    epel-testing.repo

2、docker命令的使用

  • 获取docker镜像
[[email protected] ~]# docker search centos
  • 下载docker镜像
[[email protected] ~]# docker pull centos
  • 查看docker存在的镜像
[[email protected] ~]# docker image ls
[[email protected] ~]# docker images
  • 运行镜像,产生容器
[[email protected] ~]# docker run centos
  • 查看正在运行的容器
[[email protected] ~]# docker ps
  • 查看已经挂掉的容器
[[email protected] ~]# docker ps -a
  • 删除镜像文件
#如果镜像产生的容器还有记录的话,先删掉容器,再删对应的镜像
    #1、删除容器记录
        docker rm  容器id
    #2、删除镜像
        docker  rmi 镜像名(镜像id)
    #3、批量删除容器记录
    docker rm `docker ps -aq` 
  • 交互式运行容器
docker run -it --rm centos bash 
    docker run 就是运行容器的命令。
    #参数
     -it :-i 是交互式操作,-t是终端
     -rm:容器退出后将其删除,也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。
     centos :镜像文件
     bash:指定用交互式的shell,因此需要bash命令

 3、构建自定义镜像文件

  自己下载的镜像文件是没有一些工具的,如何将下载的镜像文件假如一些工具,下次可以接着使用呢?比如在centos容器中安装pip,然后将这个容器做成镜像,以后就使用pip镜像可以用这个,是不是相对方便一些呢?

#1、进入交互式的centos容器中
[[email protected] ~]# docker run -it centos:7.3.1611 
[[email protected] /]# 

#2、在容器中安装pip工具

    #安装setuptools
    [[email protected] /]# yum install -y python-setuptools

    #安装pip
    [[email protected] /]# easy_install pip

    #查看版本
    [[email protected] /]# pip -V

 #3、安装好pip之后,exit退出容器

 [[email protected] /]# exit

 #4、查看容器记录

 [[email protected] ~]# docker ps -a

 #5、提交容器创建新的镜像

  [[email protected] ~]# docker commit 8f69c9dc428a centos_pip

  #6、查看镜像

  [[email protected] ~]# docker images

4、Dockerfile自定制镜像

  之前使用的镜像是从docker hub上获取的然后进行改造的镜像,但是有些需求是无法满足的,此时可以通过Dockerfile来进行定制,docker 可以从Dockerfile中读取指令并自动构建镜像。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

dockerfile 参数解释

Dockerfile  

FROM centos #base image,如果有指定版本的base image使用 FROM centos:7.3.1161 

LABEL maintainer=“[email protected]" #
LABEL version="1.0" 
LABEL description="This is description!  #关于image的注释信息
#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim     Python-dev #反斜线换行    
RUN   yum install python-setuptools -y 

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

EXPOSE 8000 #暴露容器内部的端口号,以及宿主机的使用

CMD ["python","app.py"] #容器启动后默认执行的命令和参数

#把宿主机内的文件,添加到容器内 #添加文件到容器内,并且还有解压缩的功能 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 mysql_VERSION 5.6 #设置一个mysql常量 RUN yum install -y mysql-server=“$MYSQL_VERSION”  

5、docker hub的使用

上述已经创建自定义的镜像,如何将镜像上传到docker hub以便以后可以拉下来直接使用呢?

#1、在linux上进行登陆,输入帐户名和密码
[[email protected] ~]# docker login

#2、注意要保证image的tag是账户名
格式:语法是:  docker tag   镜像名   帐户名/镜像名名

[[email protected] ~]# docker tag centos_pip shenjianping0307/centos_pip

#3、推送docker image到docker hub
[[email protected] ~]# docker push shenjianping0307/centos_pip:latest

#4、登陆自己的账号进行检查,是否推送成功
https://hub.docker.com/

#5、测试将本地的镜像删掉,从docker hub上拉取刚推送上去的镜像
    #删除本地镜像
    [[email protected] ~]# docker rmi shenjianping0307/centos_pip:latest 
    #查看镜像
    [[email protected] ~]# docker images
    #拉取镜像
    [[email protected] ~]# docker pull shenjianping0307/centos_pip:latest
    #运行交互式镜像    
    [[email protected] ~]# docker run -it shenjianping0307/centos_pip
   

 三、docker应用

1、dockerfile部署django应用(将django程序作为容器运行)

创建一个django项目docker_test,如下图所示为docker_test的目录结构:

[[email protected] docker_test]# tree
.
├── app01
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── dockerfile
├── docker_test
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   └── settings.cpython-35.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── requirements.txt
└── templates

5 directories, 16 files

可以看到,知识在django的manage.py文件的同级,添加了dockerfile以及requirements.txt文件,dockerfile文件的内容为:

FROM python:3.5.2 #base image

LABEL author="bright"  #作者信息

ENV PYTHONUNBUFFERED 1 #输出不缓存

RUN mkdir /webapps   #创建目录

COPY requirements.txt  /webapps

WORKDIR /webapps

RUN pip install -r /webapps/requirements.txt

ADD . /webapps/

CMD [ "python", "./manage.py", "runserver", "0.0.0.0:8080"]

requirements.txt文件为需要安装的包:

django==2.0

当上述完成后进行镜像生成:

[[email protected] docker_test]# docker build -t shenjianping0307/django_docker . #注意最后面是有一个点的

注意:执行生成镜像命令需要在dokkerfile这一级执行,否则找不到dockerfile文件

此时,可以查看生成的镜像:

[[email protected] docker_test]# docker images

运行镜像生成容器实例:

[[email protected] docker_test]# docker run -it --rm -p 8000:8080 --name django_test shenjianping0307/django_docker

注意:8000:8080表示宿主机的端口号映射到容器内的端口号

进行访问8000端口:

技术图片

注意:项目中settings文件中

ALLOWED_HOSTS = [] #修改为  ALLOWED_HOSTS = ["*"]否则报错

这样项目的镜像做好后可以直接推送到docker hub,下次使用直接拉下来就可以使用了,注意先登陆,然后再推送。

[[email protected] /]# docker login  #进行登陆

  [[email protected] /]# docker push shenjianping0307/django_docker #进行推送

当然,也可以保存到本地:

[[email protected] /]# docker save shenjianping0307/django_docker > /temp/django_docker.tar.gz    #导出镜像到本地

如果需要使用,在将其导入到镜像库:

#使用docker load从本地文件中导入到本地docker镜像库

[[email protected] temp]# docker load < django_docker.tar.gz #导入本地镜像到docker镜像库

2、利用docker容器搭建环境进行部署应用

  • 获取基础的系统镜像centos
[[email protected] ~]# docker pull centos:7.3.1161
  • 进入交互式的容器中
docker run -it centos:7.3.1611 
  • 安装python
#安装必要工具 yum-utils 管理repository及扩展包的工具
[[email protected] /]# yum install yum-utils -y

#安装缺失的软件依赖,使用下面的命令会自动处理
[[email protected] /]# yum-builddep python -y

#安装wget
[[email protected] /]# yum install wget -y

#获取python包
[[email protected] /]# wget  https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

#解压到指定目录
[[email protected] /]# tar xvf Python-3.5.2.tgz -C /usr/local/

#在/usr/local下建立目录Python3
[[email protected] local]# mkdir Python3

#切换到已经解压的目录,配置安装目录、编译源码、执行源码安装
[[email protected] Python-3.5.2]# ./configure --prefix=/usr/local/Python3 #配置安装目录

[[email protected] Python-3.5.2]# make #编译
#注意在make时如果出现bash: make: command not found错误,执行
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++

[[email protected] Python-3.5.2]# make install#执行源码安装

#创建python3.5.2软连接
[[email protected] bin]# ln -s /usr/local/Python3/bin/python3  /usr/bin/python3
  • 对pip升级

安装python时自带了pip但是版本较低,进行升级。

#创建pip软连接
[[email protected] bin]# ln -s /usr/local/Python3/bin/pip3  /usr/bin/pip3 

#对pip升级
[[email protected] bin]# pip3 install -U pip

#查看版本
[[email protected] bin]# pip3 -V
  • 生成开发环境镜像

这个就是一个包含python3.5.2以及最新版本的pip的容器,现在给它生成一个镜像,以后开发环境就用它。

#退出容器
[[email protected] /]# exit
#查看容器记录
[[email protected] temp2]# docker ps -a
#生成镜像
[[email protected] temp2]# docker commit 48a90994f9b7 centos-with-python3
  • 运行django项目

现在使用这个镜像来运行django项目

#交互式进入镜像
[[email protected] ~]# docker run -it centos-with-python3

#安装django模块
[[email protected] /]# pip3 install django==2.0

#新建一个目录用于存放django项目
[[email protected] /]# makedir webapps

#进入目录创建项目
[[email protected] webapps]# python3 /usr/local/Python3/lib/python3.5/site-packages/django/bin/django-admin.py startproject mysite
#注意:django-admin.py如果软连接会出错ImportError: No module named django.core

#生成项目的镜像
[[email protected] ~]# docker commit 17c5ac5c5ebe django_test

#运行项目镜像,主要进行端口映射,这里事先规定好了django的端口8080
[[email protected] ~]# docker run --name django_demo -itd -p 8900:8080 -v /webapps/mysite django_test:latest
#注意:--name 是生成容器的名字;-itd 输入输出终端,后台运行;-p host端口 端口映射;-v  host路径 容器内路径(这里其实写什么目录没有什么影响,/webapps也是可行的,
主要看容器内的操作);最后是使用的镜像名

#进入容器内部,启动django程序
[[email protected] ~]# docker attach django_demo 

 [[email protected] /]# cd webapps/mysite/
 [[email protected] mysite]# ls
 db.sqlite3 manage.py mysite

 [[email protected] mysite]# python3 manage.py runserver 0.0.0.0:8080 #启动
 Performing system checks...

  • 访问django项目

技术图片

 

以上是关于docker基础的主要内容,如果未能解决你的问题,请参考以下文章

Docker基础

Docker 镜像:基于 Ubuntu 的基础镜像中文问题解决

Docker 基础镜像

Docker——Docker基础+Docker安装

docker入门基础

Docker基础