DOCKER的学习记录-安装与实践

安装Docker

CentOS上安装Docker

#如果有旧版本卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
#安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加官方docker稳定版yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#国内推荐用国内源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#查看docker版本
yum list docker-ce --showduplicates | sort -r

yum makecache fast
#安装docker社区版
yum install docker-ce-18.09.8 -y #安装指定版本
yum install docker-ce #默认最新
#设置docker开机自启和启动
systemctl enable docker
systemctl start docker
#查看docker版本信息
docker info

<!--more-->

镜像加速器

CentOS修改/etc/docker/daemon.json中写入如下内容(如果文件不存在则新建该文件)

 { 
    "registry-mirrors": [ 
        "https://registry.docker-cn.com" 
    ] 
}
#或者直接执行脚本
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

#阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

重启服务

sudo systemctl daemon-reload 
sudo systemctl restart docker

镜像

管理镜像常用命令

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 显示历史镜像
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
rm 删除镜像
prune 移除未使用的镜像。没有被标记或被任何容器引用
tag 创建标记
export 导出容器文件系统到tar归档文件
import 导入容器文件系统到tar归档文件创建镜像
save 保存一个或多个镜像到tar归档文件
load 加载镜像来自tar归档或者标准输入

获取镜像

docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

默认如果没有给出registry地址,就从Docker Hub 获取镜像

运行容器

docker pull ubuntu:14.04
docker run -it --rm ubuntu:14.04 bash
  • -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容 器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果, 不需要排障和保留结果,因此使用 --rm 可以避免浪费空间
  • ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。
  • bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。

列出镜像

docker images #列出本地镜像
docker image ls #新版本命令

列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间。

其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个

镜像可以对应多个标签。因此,在上面的例子中,我们可以看到 ubuntu:16.04 和

ubuntu:latest 拥有相同的 ID,因为它们对应的是同一个镜像。

列出部分镜像

不加任何参数的情况下, docker images 会列出所有顶级镜像

#根据仓库名列出镜像
docker images ubuntu
docker image ls ubuntu #新版
#列出特定的某个镜像,也就是说指定仓库名和标签
docker images ubuntu:16.04

除此以外, docker images 还支持强大的过滤器参数 --filter ,或者简写 -f 。

#查看在 mongo:3.2 之后建立的镜像
docker images -f since=mongo:3.2
docker image ls -f since=mongo:3.2
#查看某个镜像之前建立的镜像只需要把since改为before即可

以特定格式显示

docker images -q #只显示镜像id
docker image ls -q
#使用go的模板语法自定义列出镜像结果
#只包含镜像ID和仓库名
docker images --format "{{.ID}}: {{.Repository}}"
docker images ls --format "{{.ID}}: {{.Repository}}"
#以表格等距显示,并且有标题行,和默认一样,不过自己定义列
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

镜像体积

如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。

比如, ubuntu:16.04 镜像大小,在这里是 127 MB ,但是在 Docker Hub 显示的却是 50

MB 。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是

保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而

docker images 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空

间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。

另外一个需要注意的问题是, docker images 列表中的镜像体积总和并非是所有镜像实际硬

盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为

使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保

存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

你可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。

虚悬镜像

<none> <none> 00285df0df87 5 days ago 342 M B

这个镜像原本是有镜像名和标签的,原来为 mongo:3.2 ,随着官方镜像维护,发布了新版本

后,重新 docker pull mongo:3.2 时, mongo:3.2 这个镜像名被转移到了新下载的镜像身

上,而旧的镜像上的这个名称则被取消,从而成为了 <none> 。除了 docker pull 可能导致

这种情况, docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取

消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像

(dangling image) ,可以用下面的命令专门显示这类镜像

docker images -f dangling=true

一般来说这些虚悬镜像已经没用可以用以下命令删除

docker image prune

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可

能会看到一些依赖的中间层镜像。默认的 docker images 列表中只会显示顶层镜像,如果希

望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker images -a 
docker image ls -a #新版

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层

镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依

赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而

这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会

需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。

docker commit

docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被***后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。

#把容器webserver提交成nginx:2镜像
docker commit --author "Tao Wang <[email protected]>" --message "修改了默认网页" webserver nginx:v2
docker image save fce289e99eb9 -o hello.tar #导出镜像

docker image load  < hello.tar #导入镜像

容器

创建容器常用选项

选项 描述
-i,--interactive 交互式
-t,--tty 分配一个伪终端
-d,--detach 后台运行容器
-e,--env 设置环境变量
-p,--publish list 发布端口到宿主机
-P,--publish-all 发布容器所有EXPOSE的端口到宿主机的随机端口
-name string 指定容器名
-h,--hostname 设置容器主机名
--ip string 指定容器ip,只能用于自定义网络
--network 连接到一个网络
--mount mount 将文件系统附加到容器
-v,--volume list 绑定挂载一个卷
--restart string 容器退出时重启策略,默认no,可选值:【always|on-failure】

容器资源限制

选项 描述
-m,--memory 容器可以使用的最大内存量
--memory-swap 允许使用swap的最大量
--memory-swappiness=<0-100> 容器使用swap交换分区的百分比(0-100,默认为-1)
--oom-kill-disable 禁用OOM Killer
--cpus 可以使用的cpu数量
--cpuset-cpus 限制容器使用特定的cpu核心,如(0-3,0,1)
--cpu-shares cpu共享(相对权重)

示例

内存限制
#允许容器最多使用500M内存和100M的Swap,并禁用OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx
CPU限制
#允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
#允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx

管理容器常用选项

选项 描述
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行的容器中执行命令
commit 创建一个新镜像来自容器
cp 拷贝文件/文件夹到容器
logs 获取容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器

管理容器数据

Docker提供三种方式将数据从宿主机挂载到容器中:

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。

  • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。

  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

Volume

#管理卷: 
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
#用卷创建一个容器: 
docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
#清理: 
docker stop nginx-test
docker rm nginx-test 
docker volume rm nginx-vol

注意:
1.如果没有指定卷,自动创建。
2.建议使用--mount,更通用

Bind Mount

#用卷创建一个容器:
docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
#验证绑定:
docker inspect nginx-test
#清理:
docker stop nginx-test
docker rm nginx-test 

注意:

1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。

2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏

小结

Volume特点:

  • 多个运行容器之间共享数据。

  • 当容器停止或被移除时,该卷依然存在。

  • 多个容器可以同时挂载相同的卷。

  • 当明确删除卷时,卷才会被删除。

  • 将容器的数据存储在远程主机或其他存储上

  • 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

Bind Mounts特点:

  • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。

  • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。

  • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

容器网络

网络模式

  • bridge

    --net=bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中

  • host

​ --net=host容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。

  • none

​ --net=none 获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置

  • container

​ --net=container:Name/ID与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。

  • 自定义网络

​ 与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信

网络原理

DOCKER的学习记录-安装与实践

Dockerfile

Dockerfile指令

指令 描述
FROM 构建新镜像是基于哪个镜像
MAINTAINER 镜像维护者姓名或邮箱地址
RUN 构建镜像时运行的shell命令
COPY 拷贝文件或目录到镜像中
ENV 设置环境变量
USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
HEALTHCHECK 容器中服务健康检查
WORKDIR 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录
ENTRYPOINT 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效

构建镜像

构建镜像指令

Usage: docker build [OPTIONS] PATH | URL | -[flags]

Options:

-t, --tag list # 镜像名称

-f, --file string # 指定Dockerfile文件位置

docker build .

docker build -t shykes/myapp .

docker build -t shykes/myapp -f /path/Dockerfile /path

docker build -t shykes/myapp http://www.example.com/Dockerfile

构建基础镜像

实例1.构建tomcat镜像

FROM centos:7
MAINTAINER www.vaedit.com

ENV VERSION=8.5.47

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*

RUN wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
    tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/test && \
    echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

企业级容器仓库Harbor

Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

Harbor安装部署

  1. 下载harbor离线安装包:harbor-offline-installer-v1.6.1.tgz

  2. 解压并进入目录

  3. 修改配置文件harbor.cfg

    hostname = reg.vaedit.com
    harbor_admin_password = Harbor12345
  4. ./prepare

  5. sh install.sh

使用私有仓库注意点

#需要在/etc/docker/daemon.json中添加私有仓库信任
{
        "registry-mirrors": [
        "http://f1361db2.m.daocloud.io"
    ],
        "insecure-registries":[
        "192.168.0.6"
    ]
}

Jenkins和docker CI/CD

  • 持续集成(Continuous Integration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。
  • 持续部署(ContinuousDeployment,CD):部署到测试环境、预生产环境、生产环境。
  • 持续交付(ContinuousDelivery,CD):将最终产品发布到生产环境,给用户使用。

pipeline示例

node {   // 指定Slave标签
   // 拉取代码
   stage('Git Checkout') { 
        checkout([$class: 'GitSCM', branches: [[name: '$Branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/tomcat-java-demo.git']]])
   }
   // 代码编译
   stage('Maven Build') {
        sh '''
        export JAVA_HOME=/usr/local/jdk
        /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
        '''
   }
   // 项目打包到镜像并推送到镜像仓库
   stage('Build and Push Image') {
        sh '''
        REPOSITORY=192.168.0.6/test/java-demo:${Branch}
        echo '
        FROM 192.168.0.6/test/tomcat:v1
        COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
        ' > Dockerfile
        docker build -t $REPOSITORY .
        docker login -u vaedit -p 1qaz@WSX 192.168.0.6
        docker push $REPOSITORY
        '''
   }
   // 部署到Docker主机
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=192.168.0.6/test/java-demo:${Branch}
        docker rm -f java-demo |true
        docker image rm $REPOSITORY |true
        docker login -u vaedit -p 1qaz@WSX 192.168.0.6
        docker run -d --name java-demo -p 88:8080 $REPOSITORY
        '''
   }
}

jenkins安装插件报错

jenkins插件下载中心:http://updates.jenkins-ci.org/download/plugins/

DOCKER的学习记录-安装与实践

报安装插件依赖错误,则需要手动从上面网址下载插件版本,并上传安装

docker 常用命令

docker rm -f $(docker ps -qa) #删除所有容器

docker stats 容器id #查看容器资源情况

猜你喜欢

转载自blog.51cto.com/vaedit/2633143