docker安装与使用

一,容器概念

容器三大基本概念
镜像 image
容器 container
仓库 repository
docker整个生命周期就是这三个概念。

docker镜像

image相当于一个root文件系统,比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。

image的分层存储

因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。

docker容器

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

docker仓库

镜像构建完成后,可以很容易的在宿主机上运行,如果要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务。docker registry就是这样的服务。
一个docker registry可以包含多个仓库(repository),每个仓库有多个tag(标签),每个标签对应一个镜像。
一个仓库包含同一个软件不同版本的镜像,标签就是用于标记版本的。

ubantu:14.04
ubantu:16.05
不指定tag的话默认是
ubantu:latest
仓库名海会以 bob/nginx-proxy形式出现,表明docker registry多用户环境下的 用户名/软件名

docker Registry

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。

除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。
国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后 面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓 库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。

二,安装

请遵循官方安装方式!!!

https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script

官方教程如下,最正确安装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

5. 查看版本
docker version
#yum安装软件的整个过程
1.配置yum源,在/etc/yum.repos.d/下产生 docker.repo文件
2.检查这个文件中的baseurl地址,下载的软件包就来自于这里
3.baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
4.查看yum到底安装的是谁
    docker-ce-18.09.0-3.el7.x86_64.rpm                                                    2018-11-07 23:58:48 18.7 
    docker-ce-cli-18.09.0-3.el7.x86_64.rpm  
5.yum自动下载rpm包,自动解决依赖关系,非常方便
6.通过yum下载的软件包,systemctl进行管理
7. systemctl start docker 
8.docker version查看版本



假如你配置yum官方仓库无法安装,由于网络因素,那你就别配yum官方仓库了,删掉仓库
通过自带的epel源下载  yum install docker  ,只是这个版本较低,
安装过程详解

docker版本

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。
企业版包含了一些收费服务,个人开发者一般用不到。本文的介绍都针对社区版。

 系统环境准备

docker最低支持centos7且在64位平台上,内核版本在3.10以上

[root@oldboy_python ~ 10:48:11]#uname -r
3.10.0-693.el7.x86_64

Docker镜像加速器

https://www.daocloud.io/mirror#accelerator-doc


https://www.cnblogs.com/pyyu/p/6925606.html
#一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io


# 或者也可以手动
vim /etc/docker/daemo.json
写入
{"registry-mirrors": ["http://95822026.m.daocloud.io"]}

三,使用

1,基本命令

启动docker

systemctl  start/restart/stop  docker

基本命令

1.docker加速器,加速镜像下载
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
2.获取docker镜像
docker search ubuntu   #查找ubuntu镜像
docker pull ubuntu  #下载ubuntu镜像
3.查看docker存在哪些镜像
docker image ls
docker images 
4.删除镜像文件
    1.删除容器相关记录
        docker rm  容器id 

    2.删除镜像记录
       docker  rmi 镜像名(镜像id)
    
    3.批量删除容器记录
    docker rm `docker ps -aq` 
    
5.检查容器进程(存活)
docker ps 
6.检查容器进程记录(挂掉的)
docker ps -a 
7. 运行镜像,产生容器
docker run hello-world 
8.交互式运行docker容器
docker run -it --rm ubuntu bash 
    docker run就是运行容器的命令。
    参数
     -it : -i 是交互式操作,-t是终端
     -rm  :   容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。
     ubuntu:14.04   这指的是镜像文件
     bash   :  指定用交互式的shell,因此需要bash命令

后台模式启动docker

-d参数:后台运行容器,返回容器ID

# docker在centos中运行一段shell脚本,后台运行
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done" # 返回结果
c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65
#检查容器进程docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0283f1077d1 centos "/bin/sh -c 'while..." 6 seconds ago Up 5 seconds fervent_turing

查看容器内的标准输出

docker logs c02

停止容器

docker stop c02
#此时容器进程不存在
docker ps

启动容器

docker start c02
#检查容器进程
docker ps
删除容器
docker rm c02

2,提交创建自定义的镜像(docker container commit)

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 sss/centos-vim
6.查看镜像文件
[root@master /home]docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sss/centos-vim   latest              fd2685ae25fe        5 minutes ago       348MB

3,搭建简单web应用,外部访问容器

容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。

-P 参数会随机映射端口到容器开放的网络端口
#docker run -d -P training/webapp python app.py

检查映射的端口

#宿主机ip:32768 映射容器的5000端口
[root@oldboy_python ~ 16:34:02]#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi

查看容器日志信息

#不间断显示log
docker logs -f cfd

也可以通过-p参数指定映射端口:常用

#指定服务器的9000端口,映射到容器内的5000端口
[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e

访问服务器的9000端口

(如果访问失败的话,检查自己的防火墙,以及云服务器的安全组)

查看指定容器的端口映射

#docker port c0b
5000/tcp -> 0.0.0.0:9000

查看容器内的进程

#docker top c0b
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3926                3912                0                   16:46               ?                   00:00:00            python app.py

四,发布docker image到仓库

1,docker hub公有镜像发布

1.docker提供了一个类似于github的仓库dockerhub,
网址https://hub.docker.com/需要注册使用
2.注册docker id后,在linux中登录dockerhub
docker login

注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag ubuntu mrglh/ubuntu
语法是: docker tag 仓库名 mrglh/仓库名

3.推送docker image到dockerhub docker push mrglh/ubuntu
4.在dockerhub中检查镜像 https://hub.docker.com/

5.删除本地镜像,测试下载pull 镜像文件 docker pull mrglh/ubuntu

2,私有仓库

但是这种镜像仓库是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库

docker私有仓库搭建:
    docker  
    -v 参数  
    假设我要在docker容器中安装 nginx 软件
        nginx软件有网页根目录
            root  /opt/static/nginx 
                        js 
                        css 
    这个nginx静态文件,可以放在容器中管理
    也可以通过-v参数挂载一个数据
            -v  宿主机/opt/staic/nginx      容器/opt/static/nginx  
                        js1 js2 js3              容器中的nginx软件,读取数据时候,通过-v参数,去宿主机读取
步骤详解
1.找到本地docker文件 vim /etc/docker/daemon.json 2.写入配置 必须注意此文件是json格式!!!注意引号 {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["45.32.52.244:5000"] } 3.将此文件,添加到docker服务脚本中 vim /lib/systemd/system/docker.service 4.写入以下配置,注意!!!,写入到[Service]配置块中,加载此配置文件 [Service] EnvironmentFile=/etc/docker/daemon.json 5.修改了docker配置文件,重新加载docker systemctl daemon-reload 6.重启docker服务,使得生效 systemctl restart docker 7.由于重启了docker,所有的容器实例全挂了,因此要打开私有仓库的容器实例 1.docker ps -a 检查私有仓库的容器记录 2. docker start 私有仓库的id 3.此时docker ps 检查 私有仓库服务是否启动 8.修改本地镜像的tag,便于推送到本地镜像仓库 docker tag 镜像名 45.32.52.244:5000/镜像名 如 docker tag ubuntu 45.32.52.244:5000/ubuntu 9.推送本地镜像到私有docker仓库 docker push 45.32.52.244:5000/ubuntu 10.docker私有仓库提供了API数据可供查看 http://10.0.0.10:5000/v2/_catalog 11.可以测试删除本地镜像,然后从私有仓库拖取镜像 docker pull 45.32.52.244:5000/ubuntu

 五,利用dockerfile定制镜像

镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。

  • 镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile

    Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

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 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 
存储和网络

RUN and CMD and ENTRYPOINT
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

Shell格式和Exec格式
RUN yum install -y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt-get”,”install”,”-y”,”vim”]
CMD [“/bin/echo”,”hello docker”]
ENTRYPOINT [“/bin/echo”,”hello docker”]


通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量
    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

CMD
容器启动时默认执行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定义多个CMD,只有最后一个执行

ENTRYPOINT
让容器以应用程序或服务形式运行
不会被忽略,一定会执行
最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT [“docker-entrypoint.sh]
EXPOSE 27017
CMD [“mongod”]

[root@master home]# more Dockerfile
FROm centos
ENV name Docker
#CMD ["/bin/bash","-c","echo hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
相关配置
# 使用Dockerfile 打包一个flask的web的docker

确保app.py和dockerfile在同一个目录!
1.准备好app.py的flask程序
[root@master home]# cat app.py
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)
[root@master home]# ls
app.py  Dockerfile

2.编写dockerfile
[root@master home]# cat Dockerfile
FROM python:2.7
LABEL maintainer="Chao Yu<yc_uuu@163.com>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 8080  # 暴露出docker容器的8080端口
CMD ["python","app.py"]

3.构建镜像image
docker build -t yuchao163/flask-hello-docker .

4.查看创建好的images
docker image ls

5.启动此flask-hello-docker容器,映射一个端口供外部访问
docker run -d -p 8080:8080 yuchao163/flask-hello-docker

6.检查运行的容器
docker container ls

六,导出与导入docker镜像

导出到本地:

如果要导出镜像到本地文件,可以使用docker save命令。

[root@docker ~]# docker save centos > /opt/centos.tar.gz  #导出docker镜像至本地

[root@docker ~]# ll /opt/

-rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz

从本地导入docker:

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

[root@docker ~]# docker load < /opt/centos.tar.gz   #导入本地镜像到docker镜像库

[root@docker~]# docker images  #查看镜像导入情况

REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

docker.io/centos     latest              60e65a8e4030        5 days ago          196.6 MB

 


posted @ 2018-11-16 11:20  Mr.GLH  阅读(846)  评论(0)    收藏  举报
Top↑