docker学习

摘要:
docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后会立即生效,不需重启docker服务。vi/etc/docker/daemon.json#通用配置方法,无论新旧版本#添加如下镜像源{"registry-mirrors":["http://registry.docker-cn.com"]}systemctlrestartdockertips:一般注册的镜像仓库都是公共读私有写。容器管理命令说明:新版相比老版本加入了管理的子命令:image、container等,可以通过dockercontainer--help查看子命令的使用方法。

Docker 介绍

docker是什么

操作系统级别的虚拟化,基于linux内核的namespace和cgroup

docker 与虚拟机对比

启动秒级,虚拟机是分钟级别

磁盘几M,虚拟机G级别

隔离程度相比虚拟机较低

应用场景

打包程序发布

部署微服务

测试

持续集成

应用程序隔离,环境的一致性,迁移方便  

安装配置

官网 www.docker.com

安装文档:docs.docker.com

操作系统:centos7 注:6只支持一些老版本,要想使用好docker 内核版本要在3.8以上。

docker 版本

CE 社区版

EE 企业版

老的版本安装名就是docker ,新版本是 docker-ce

早期的docker 版本号是1.13.x这种形式 : 大版本号.小本版本号.bug版本号,从17年开始版本号命名就是年年.月月.xx 形式,从这时候开始区分为社区版本和企业版。所以18.09.3 表示18年九月发行的版本。

安装

关闭防火墙/selinux

安装过程参照官方文档:

yum -y install yum-utils

yum-config-manager --add-repo=http://...
yum list  docker-ce  --show-duplicates    显示所有版本,然后安装制定版本(如果直接yum install默认按照的是最新版本)

yum -y install docker-ce-版本号

注:如果是内网安装可以采用二进制方式,去官网下载二进制包,把这些包放在/usr/bin即可,复制docker.service 到/usr/lib/systemd/system/ 下

执行命令systemctl daemon reload systemctl start docker 即可

配置

Docker的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS中的位置是:/etc/sysconfig/docker。

docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后会立即生效,不需重启docker服务。

mkdir  /etc/docker/

vi /etc/docker/daemon.json

{

  "data-root":"  "/data/docker-root",      #docker服务的根目录"storage-driver": "overlay2",           #早期存储驱动是overlay
"insecure-registries": ["registry.kzf.com"],   #私有镜像仓库地址访问一般证书都是自签的,为了跳过验证证书不合法的步骤,配置此项
"exec-opts": ["native.cgroupdriver=systemd"],  #后期上k8s 的话,cgroup的驱动要与kubelet 一致

“live-restore”: true#容器进程挂了,但是容器还存活
}

关于docker 根目录,是docker 所有数据存储的统一目录(镜像、容器、卷等),17及最新版本都是用 `data-root`代替`graph`了,这里的修改请一定确认好你的docker版本,最新的有最新的要求和规

启动/加入自启:systemctl start docker ...

docker info

如果安装配置正常就会输出info 信息

docker version

创建/启动容器

docker run -it nginx

#run 启动并且运行,it 当前终端启动,nginx 镜像名,默认先从本地寻找,如果没有就去官方仓库下载镜像并且启动为容器,不加tag 默认就是最新版本的

docker ps #查看当前启动的容器

镜像

镜像仓库

默认是国外镜像源,可以更改为国内的官方镜像源。

vi /etc/docker/daemon.json    #通用配置方法,无论新旧版本

#添加如下镜像源
{
"registry-mirrors": ["http://registry.docker-cn.com"]
 }

systemctl restart docker                             

tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。
镜像名字结构
registry-address/prject-group/image-name:tag        # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号
镜像仓库登陆/拉取和推送
首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/ docker
loginxxxx           #xxxx镜像仓库地址
docker push
sadp/nginx:1.12 #没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址
docker  push   registry-asdf.com/sadp/nginx:1.12    #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面
注意:在docker push之前必须登录,一次认证后docker 会记住对应 registry 的登陆信息,下次push 无需登陆。登录信息存储在用户 Home 下的 .docker 文件夹下的config.json信息如下:

{
"auths": {
"registry.sensedeal.wiki:8443": {
"auth": "bGljaGVuOlNasdfwefdMjA="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.3 (linux)"
}

echo "bGljaGVuOlNasdfwefdMjA=" | base64 -d #可以解密出来 用户名和密码

镜像构成

镜像是分层的,查看镜像构建历史 docker history nginx,docker 数据目录是/var/lib/docker/

里面存储着镜像和容器。

docker学习第1张

存储驱动

存储镜像的驱动,不同操作系统支持的驱动类型不一样,性能最好的是overlay2。

docker学习第2张

容器管理命令

说明:新版相比老版本加入了管理的子命令 : image、container等,可以通过docker container --help 查看子命令的使用方法。

docker help

镜像相关命令

docker学习第3张docker学习第4张
docker  image  help                #查看镜像相关命令

docker info#显示信息包括镜像地址信息

docker images                    #查看本地仓库存在的镜像(注意只是本地的镜像)

镜像名字结构
registry-address/prject-group/image-name:tag        # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号
tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。


镜像仓库登陆/拉取和推送

首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/
docker  loginxxxx           #xxxx镜像仓库地址

docker research nginx           #搜索镜像

docker  pull  nginx             #如果没有指定地址那么就是默认镜像仓库地址,如果没有指定tag那么tag 就是默认的latest

docker tag    nginx:v1   nginx:v1.1#更改镜像tag ,实际上更改后的镜像与原镜像的id 一样
docker  push   sadp/nginx:1.12#没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址
docker  push   registry-asdf.com/sadp/nginx:1.12    #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面。如果没有地址就是默认的地址

注:如果是官方的docker 地址,那么拉区推送镜像的时候默认的就是library 组下,例如docker pull  nginx  等同于  docker  pull  docker.io/library/nginx

当无法使用镜像仓库的时候可以通过把其他主机上镜像到处再上传到无法使用镜像主机,再倒入本地,具体命令如下:
docker image  save nginx:1.12  > nginx.tar#把容器导出为文件

docker image  load  -i <  nginx.tar#把文件导入到镜像仓库

docker image export 容器ID  > name.tar#把容器导出为文件

docker image import name.tar#导入文件为镜像到本地仓库


构建镜像
docker build -t registry.cn-beijing.aliyuncs.com/asdf/image-name:tag  -f  /.../path/Dockerfile path  #根据dockerfile在本地仓库生成镜像,注意registry..地址只是镜像名一部分,不表示镜像生成在阿里云。

  -t 指定创建镜像索引路径和名称

  -f 指定Dockerfile 路径如果不写默认就是后面path路径下的名字为Dockerfile 文件

  path 上下文路径:就是Dockerfile 中命令执行的路径,例如复制文件就是在这个路径下寻找要复制的文件的。

docker push registry.cn-beijing.aliyuncs.com/asdf/image-name:tag  #把本地仓库镜像推送到远程仓库,远程仓库地址会根据本地镜像名字识别(registry.cn-beijing.aliyuncs.com.. 表示远程仓库为阿里云,如                                                                                                                   果本地镜像名字中不包含镜像地址信息就会默认推送到docker 配置文件中配置的仓库。


删除镜像
docker rmi  asdfasdfsd    #可以删除镜像名字也可以是id
docker rmi -f id          #如果两个镜像tag相同那么需要强制删除才可以
View Code

docker commit -p container-name img-new:tag    #提交修改。保存当前容器内的更改,生成新的镜像img-new:tag

容器相关

docker学习第5张docker学习第6张
docker container  --help

docker container run -itd -e a="kobe"  -p 8080:80 --name  nginx-container nginx  # -i 交互式 -t 分配一个伪终端,-d 后台运行,如果不加此参数就会占用当前终端。-e 定义一个变量传递到容器里面。-p 把宿主机端口8080映射到容器内部80, --name 容器命名,  nginx 镜像名字                                                                                                                                     器里面80 端口映射到宿主机的8080端口

docker container start/stop/restart           #启动/停止容器

docker ps                           #查看正在运行的容器,-a 表示查看包括已经停止的容器在内的所有容器

docker container attach  container-name        #进入容器,直接退出会导致容器终止,可以ctrl+p+q  退出。有时候会卡住因为会与容器里面的进程争抢当前终端,所以最好用exec 进入容器。

docker container exec -it nginx-1 bash         #交互式打开容器执行一个命令,最后面参数必须是一个要在容器中执行的命令,如果不是bash/sh 那么指挥执行一次就退出容器。sh/bash 会进入                                                                                                      容器,再次退出不会终止容器运行

docker logs  nginx-1                     #查看容器日志, -f 表示持续实时接收日志。 /var/lib/docker/containers/xxxxx.json.log  #容器日志保存位置

docker rm asdfas/docker-name               #删除容器根据容器id或者名字,-f 可以强制删除正在运行的容器,不加则无法删除正在运行容器

docker  container  inspect  container-id#查看容器详细信息

docker cp  /root/a.txt  container-name:/opt/#把当前目录文件复制到容器当中

docker contianer commit  contianer-name  image-name:tat  #把当前容器提交保存到当前仓库存为一个镜像。不建议这么做,一般这种需求可用dockerfile 实现。

docker stats container-name               #查看实时资源使用情况

docker port container-name               #查看容器端口映射情况

docker update                       #在线更改容器资源使用配置



容器启动的一些参数 docker run  ..

--name    给容器命名,如果没有会随机生成名字
--rm    当容器推出的时候就会删除容器,docker ps -a 就无法查找到了
--restart 重启策略,默认为no ,on-failure 在容器非正常退出时(退出状态非0),才会重启容器,always 不管退出状态码是什么,始终重启容器,当指定always时,docker daemon将无数次的重启容器,容器也会在daemon启动时尝试重启,不管容器的状态如何。
限制宿主机资源使用如下参数

--cpus                           #设置使用的cpu 核数

--cpuset-cpus                        #指定使用特定的cpu

--cpu-shares                        #cpu 使用的权重值

--memory                          #限制使用的内存大小,默认使用的swap 分区大小为此值的2倍。
其他参数
-p     映射端口,8080:80前面宿主机端口,后面容器端口
-v     挂载数据卷,把宿主机磁盘目录挂到容器内,如果容器内目录不为空那么宿主机数据会覆盖之
-e     传递环境变量到容器内
View Code

宿主机数据挂载到容器

三种方式

docker学习第7张

volumes              

所有目录都是在/var/lib/docker/volumes目录下挂载,现在此目录下创建挂载卷以供容器挂载

docker volume  create nginx-vol       #创建数据卷

ls /var/lib/docker/volumes/nginx-vol/#在此目录会有一个目录名

docker run -it --name=nginx-test --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html  nginx  #挂载,如果不指定src 会自动创建卷,会把容器要挂载目录自带的数据自动放到宿主机要挂载的目录

bind  

只要宿主机存在的目录都可以挂载到volumes中,当容器中目录存在数据,那么此目录挂载后会隐藏里面的数据。

docker run -itd --name=nginx-cv --mount type=bind,src=/app/html,dst=/usr/share/nginx/html  nginx
docker run -itd --name=nginx-cv -v /app/html:/usr/share/nginx/html nginx # 这个命令与上面命令效果一样

两者比较

volumes 相比于bind 性能更好,因为它绕过了存储。如果读写数据频繁的场景最好挂载到volumes。

网络模式

docker学习第8张

bridge模式结构

每一个容器都会获取一个独立的namespace,同一个网桥下的容器网络是互通的

docker学习第9张

相关命令

yum -y install bridge-utils

brctl show

docker network ls

host 模式

与宿主机处于同一个命名空间,无需像bridge模式一样需要端口映射,直接占用宿主机的端口。

docker  run  -itd  --name  test1  --net host nginx

docker exec -it test1 bash

ifconfig    #执行命令后宿主机的网卡也会同时显示

none 模式

获取独立的命名空间,但是不配置网络,可以后期指定网段。

container 模式

与指定的container 共用一个network namespace,网卡配置也是相同的

自定义

可以通过自定义生成一个网桥,实际还是bridge模式

免责声明:文章转载自《docker学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL Binlog详解基于MPLAB X IDE配置位设置讲解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

deppin Linux下安装docker

首先楼主用的是deppin15.11   docker 简介:Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中。         思想:              1.集装箱             2.标准化             3.隔离           核...

工作流调度器azkaban(以及各种工作流调度器比对)

1:工作流调度系统的作用: (1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序、hive脚本等;(2):各任务单元之间存在时间先后及前后依赖关系;(3):为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行; (4):举例说明工作流调度系统的具体作用:   我们可能有这...

HP-UX常用命令

常用HPUX技术URL 所有简体中文产品文档 http://docs.hp.com/zh_cn/allproducts.html 英文HPUX论坛 http://forums11.itrc.hp.com/service/forums/familyhome.do?familyId=117&admit=109447626+1242092310847+2...

Linux-026-Centos Nginx 配置 pid 文件路径解决 service nginx status 提示:Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory

在使用 service nginx status 命令查看 nginx 的运行状态时,提示:Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory 导致 nginx 服务关闭,服务不可用,具体提示信息如下所示 查看 nginx.conf 配置...

.Net Core自动化部署系列(二):使用Jenkins打造镜像发布流水线

一、简介 之前写过一篇关于Jenkins搭配GitLab实现.net core项目自动发布到IIS的博文,比较简单哈,只是个Demo。本篇我们将会使用Jenkins搭配GitLab实现镜像的自动打包和上传,这篇其实是一个铺垫篇,因为后面我们需要使用Jenkins实现kubernetes的发布流水线,即实现镜像的自动化打包和部署。 二、打包镜像 Jenkin...

使用Docker构建redis集群

1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点。因此要构建六个redis的docker容器。在宿主机中将这六个独立的redis结点关联成一个redis集群。需要用到官方提供的ruby脚本。 2构建redis基础镜像 本文选择版本为redis-3.0.7,如果需要其他版本,直接修改wget后面地址中的版本号即可。 代码清单2-1 下载&...