docker学习笔记一
知识点:
1)docker简介
2)docker安装,仓库配置
3)docker仓库镜像拉取,导出,导入,删除
4)docker容器操作,容器的创建,删除,运行,停止,日志查看等。
5) docker网络,存储
例:
docker run -d --name mynginx_2 -v /data/d:/data/c -p 80:80 -p 443:443 mynginx:v1
1.Docker简介和KVM区别
1.1 历史简介
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker 是通过内核虚拟化技术(namespaces及cgroups等,这里的内核技术指的是Linux内核哦)来提供容器的资源隔离与安全保证等。由于docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(Virtual Machine Monitor),以及hyperisor)支持,他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求很低。最本质特征docker是通过隔离来进行创建容器,而KVM等均为通过模拟方式创建虚拟机
1.2 优势说明
更快的交付和部署
使用docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码,只要开发测试过的代码,就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间
更高效的资源利用
docker 容器不需要额外的虚拟化管理程序支持,他是内核级的虚拟化,可以实现更高级的性能,同时对资源的额外需求很低
更轻松的迁移和扩展
docker容器几乎可以再任意的平台上运行,包括物理机、虚拟机、公有云、私有云、
个人电脑、服务器等,同事支持主流的操作系统发行版本。这种兼容性让用户可以在
不同平台之间轻松地迁移应用
1.3 对比KVM
docker容器很快,启动和停止可以再秒级实现,而传统的虚拟机需要数分钟
docker容器对系统资源需求很少,一台主机上可以同时运行数百甚至上千个docker容
器
docker 通过类似于git的设计理念的操作来方便用户获取、分发和更新应用镜像,存储
复用,增量更新
docker通过dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化
1.4 docker的特性
Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。(一次构建多处运行,像不像JAVA呢)。docker是传统的CS架构分为docker client和docker server,主要分为三大组件镜像(image)、容器(container)、仓库(Repository)。那么docker和我们之前接触的openstack又有什么区别呢?他们的区别如下所示。
2.安装与配置
2.1 安装
# yum install docker -y
# systemctl enable docker
# Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2.2 配置三方仓库(当然也可以直接使用,不过有点慢而已)
本例使用的是阿里云容器镜像服务中的镜像加速器,使用加速器可以提升获取Docker官方镜像的速度
https://y4869biq.mirror.aliyuncs.com 是我的加速器地址
操作步骤
1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档如下
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://y4869biq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl status docker
docker默认储存路径
[root@mytest logs]# ls /var/lib/docker/
containers image network overlay2 plugins swarm tmp trust volumes
更换存储目录
vim /usr/lib/systemd/system/docker.service
ExecStart对应处添加--graph=/opt/docker参数
docker的dns服务
(默认docker是采用宿主机的dns,如果要修改docker的dns方法有两种,一种是直接修改宿主机的dns,另一种是添加--dns=xxxx的方式指定。)
systemctl daemon‐reload
systemctl docker restart
docker daemon --help 这里可以查看到所有支持的参数
3.Docker快速入门
3.1镜像操作
就和我们之前学过的openstack一样,我们需要一个镜像才能够启动容器,从而对
查看镜像
docker search nginx
拉取镜像
docker pull alpine
默认情况下会拉取 latest 版本
以上是我们在服务器能够联网的情况下获取镜像的方法,docker 默认也提供了离线方式
镜像导出
docker save centos > /opt/centos.tar.gz
默认我们导出成tar.gz形式,当然我们也可以通过tar命令进行解压,解压之后我们可以
镜像导入
docker load < /opt/centos.tar.gz
查看本机存在镜像
docker images
查看容器的详细信
docker inspect
删除镜像
docker rmi alpine
实例:
搜索镜像
[root@mytest logs]# docker search alpine
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/alpine A minimal Docker image based on Alpine Lin... [OK]
docker.io docker.io/mhart/alpine-node Minimal Node.js built on Alpine Linux
docker.io docker.io/anapsix/alpine-java Oracle Java (and ) with GLIBC 2.23 over... [OK]
docker.io docker.io/gliderlabs/alpine Image based on Alpine Linux will help you ...
docker.io docker.io/frolvlad/alpine-glibc Alpine Docker image with glibc (~12MB) [OK]
拉取镜像
[root@mytest logs]# docker rmi alpine
Untagged: alpine:latest
Deleted: sha256:11cd0b38bc3ceb958ffb2f9bd70be3fb317ce7d255c8a4c3f4af30e298aa1aab
Deleted: sha256:73046094a9b835e443af1a9d736fcfc11a994107500e474d0abf399499ed280c
[root@mytest logs]# docker pull alpine
Using default tag: latest
Trying to pull repository docker.io/library/alpine ...
latest: Pulling from docker.io/library/alpine
8e3ba11ec2a2: Pull complete
Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
Status: Downloaded newer image for docker.io/alpine:latest
查看本机存在镜像
[root@mytest logs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/alpine latest 11cd0b38bc3c weeks ago 4.41 MB
导出镜像
[root@mytest logs]# docker save alpine >/tmp/alpine.tar.gz
[root@mytest logs]# ls /tmp/
alpine.tar.gz
删除镜像
[root@mytest logs]# docker rmi alpine
Untagged: alpine:latest
Untagged: docker.io/alpine@sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
Deleted: sha256:11cd0b38bc3ceb958ffb2f9bd70be3fb317ce7d255c8a4c3f4af30e298aa1aab
Deleted: sha256:73046094a9b835e443af1a9d736fcfc11a994107500e474d0abf399499ed280c
[root@mytest logs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
导入镜像
[root@mytest logs]# docker load < /tmp/alpine.tar.gz
73046094a9b8: Loading layer [==================================================>] 4.672 MB/4.672 MB
Loaded image: docker.io/alpine:latest
[root@mytest logs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/alpine latest 11cd0b38bc3c weeks ago 4.41 MB
3.2容器操作
显示正在运行的容器有哪些
docker ps
docker ps -a 显示所有容器
创建一个容器
docker run centos echo "Hello Wolrd"
其实run 等于create + start 不过我们通常都会用run的方式
[root@mytest logs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/alpine latest 11cd0b38bc3c weeks ago 4.41 MB
创建并启动容器alpine,-it表示可交互式,--name danny指定容器名称,便于识别
[root@mytest logs]# docker run -it --name danny alpine sh (因为alpine镜像很小,可能很多命令是没有的)
/ # ls
bin etc lib mnt root sbin sys usr
dev home media proc run srv tmp var
/ # cd /tmp/
/tmp # ls
/tmp # mkdir danny
/tmp # touch test.txt
/tmp # ls
danny test.txt
/tmp # echo "" >test.txt
/tmp # cat test.txt /tmp # exit
[root@mytest logs]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(注:以上docker为前台进程,退出控制台,进程也退出,所以docker ps显示无docker进程运行。)
[root@mytest logs]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@mytest logs]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa86ec737406 alpine "sh" minutes ago Exited () minutes ago trusting_jepsen
15d3cc7d3ee3 alpine "sh" minutes ago Exited () minutes ago romantic_babbage
ea181e0f32bc alpine "sh" minutes ago Exited () minutes ago affectionate_knuth
d212402edb3a alpine "echo 'Hello World..." minutes ago Exited () minutes ago angry_mestorf
24e088998106 alpine "echo 'Hello World'" minutes ago Exited () minutes ago happy_austin
删除容器
[root@mytest logs]# docker rm fa86ec737406 15d3cc7d3ee3 ea181e0f32bc d212402edb3a
fa86ec737406
15d3cc7d3ee3
ea181e0f32bc
d212402edb3a
[root@mytest logs]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24e088998106 alpine "echo 'Hello World'" minutes ago Exited () minutes ago happy_austin
nginx镜像容器实例:
拉取nginx镜像
[root@mytest logs]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for docker.io/nginx:latest [root@mytest logs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest c82521676580 weeks ago MB
docker网络访问
[root@izm5edykqg8tzid352ga0iz ~]# docker run -i -P -d --name mynginx nginx //-P:随机映射
4feb1d426b6f1c04740e693339a7e3072dc958aaa338d35d484da33b1b48632c
[root@izm5edykqg8tzid352ga0iz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4feb1d426b6f nginx "nginx -g 'daemon ..." seconds ago Up seconds 0.0.0.0:->/tcp mynginx
696cd0ad637b centos "bash" hours ago Up hours hopeful_brahmagupta
(此处对于docker的nginx容器,宿主机使用了随机端口32768映射到容器内部的80端口,所以在物理机直接访问80是没办法访问的,只能通过宿主机的映射端口访问)
[root@izm5edykqg8tzid352ga0iz ~]# curl -I http://localhost:32768
HTTP/1.1 OK
Server: nginx/1.15.
Date: Mon, Sep :: GMT
Content-Type: text/html
Content-Length:
Last-Modified: Tue, Aug :: GMT
Connection: keep-alive
ETag: "5b854edd-264"
Accept-Ranges: bytes -p指定映射
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip:containerPort
-p hostPort:containerPort:udp [root@izm5edykqg8tzid352ga0iz ~]# docker run -d -p : --name mynginx nginx
e7f1f7d76ec3ce1db6fb0f05d13b5b7b17bbf9971e4eec2102bc160a8c89d009
[root@izm5edykqg8tzid352ga0iz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7f1f7d76ec3 nginx "nginx -g 'daemon ..." seconds ago Up seconds 0.0.0.0:->/tcp mynginx
696cd0ad637b centos "bash" hours ago Up hours [root@izm5edykqg8tzid352ga0iz ~]# curl -I http://localhost:81
HTTP/1.1 OK
... 当然也可通过外网访问
[root@izm5edykqg8tzid352ga0iz ~]# curl -I http://外网IP:81
HTTP/1.1 OK
...
docker 多端口映射
[root@izm5edykqg8tzid352ga0iz data]# docker run -d -p : -p : --name mynginx_3 mynginx:v2
ebc7461617dfd111de753a2c2168ff5499a3481e8617e97d0381051432884c43
[root@izm5edykqg8tzid352ga0iz data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebc7461617df mynginx:v2 "nginx" seconds ago Up seconds 0.0.0.0:->/tcp, 0.0.0.0:->/tcp mynginx_3
[root@izm5edykqg8tzid352ga0iz data]# curl http://公网ip
hello world
docker数据存储
数据卷
格式:
-v /data
-v src:dst //docker run -it --name volume-test1 -v /opt:/opt centos
# src :宿主机挂载目录
# dst :容器挂载目录
[root@izm5edykqg8tzid352ga0iz mysql]# docker run -it --name volume-test1 -v /data/dockerdata centos
[root@83e4dbd4cba3 /]#
[root@izm5edykqg8tzid352ga0iz /]# docker inspect volume-test1
...
"Mounts": [
{
"Type": "volume",
"Name": "1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67",
"Source": "/var/lib/docker/volumes/1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67/_data",
"Destination": "/data/dockerdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
上面可以看到该docker容器空间是挂载在物理机的/var/lib/docker/volumes/1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67/_data目录下的
在docker上的挂载点是/data/dockerdata
数据卷容器(将一个容器的目录挂载到另一个容器)
--volumes-from
[root@izm5edykqg8tzid352ga0iz mysql]# docker run -d --name danny -v /data centos94136a5214b0c66de54a547e97c30825ab17e814f5d8dd61af8cd6c65f1ba284
[root@izm5edykqg8tzid352ga0iz mysql]# docker run -it --name jeck --volumes-from danny centos
[root@0da6f925f521 /]#
进入容器方式
方法一:(常用+推荐)
获取容器pid
[root@izm5edykqg8tzid352ga0iz ~]# docker inspect --format {{.State.Pid}} 696cd0ad637b [root@izm5edykqg8tzid352ga0iz ~]# docker inspect --format {{.State.Pid}} mynginx [root@izm5edykqg8tzid352ga0iz ~]# nsenter -t -u -i -n -p //如果没有nsenter命令需要安装util-linux
[root@696cd0ad637b ~]#
(退出后容器进程不退出,可对应写一个脚本进入)
例:
#!/bin/bash
PID=$(docker inspect --format "{{.State.Pid}}" $)
nsenter -t $PID -u -i -n -p
[root@izm5edykqg8tzid352ga0iz ~]# chmod +x docker.sh
[root@izm5edykqg8tzid352ga0iz ~]# sh docker.sh d3763d3b1c72
[root@d3763d3b1c72 ~]# 方法二:
[root@mytest ~]# docker exec -it mynginx sh
(退出后容器进程也退出) 方法三:
[root@mytest ~]# docker attach mynginx
(缺点:多终端界面同步)
docker 容器重命名
docker rename 原容器名 新容器名
kill掉所有正在运行的容器
[root@izm5edykqg8tzid352ga0iz ~]# docker kill $(docker ps -a -q)
-d参数守护状态运行
[root@mytest logs]# docker run -d --name mynginx nginx
2d39f9bd66b168577bf963cf183e211d4e8ba73efb500324b4a6fc2208897e30
[root@mytest logs]#
[root@mytest logs]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d39f9bd66b1 nginx "nginx -g 'daemon ..." seconds ago Up seconds /tcp mynginx
停止后台运行的docker容器
[root@mytest logs]# docker stop mynginx
mynginx
查看容器后台访问日志
[root@mytest logs]# docker logs mynginx
172.17.0.1 - - [/Aug/::: +] "GET / HTTP/1.1" "-" "curl/7.29.0" "-"
实时动态查看docker容器日志
[root@mytest logs]# docker logs mynginx -f
docker学习笔记一的更多相关文章
- Docker学习笔记 — 配置国内免费registry mirror
Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror
- docker学习笔记1 -- 安装和配置
技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
- docker~学习笔记索引
回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...
- Docker学习笔记 - Docker容器内部署redis
Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...
- docker学习笔记(一)—— ubuntu16.04下安装docker
docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...
- Docker学习笔记总结
Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/ 一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...
- docker学习笔记二:常用命令
docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...
- docker学习笔记-1
docker学习笔记一:安装 mac安装docker docker官方文档上有这么一段话: Because the Docker daemon uses Linux-specific kernel f ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
随机推荐
- 【转】Win10开机密码忘了?教你破解Win10开机密码
[PConline 技巧]Win10开机密码忘记了怎么办?这个问题很多人都遇到过,如何破解一台Win10电脑的开机密码呢(非BIOS开机密码)?其实很简单,利用下面这个方法,分分钟就能搞定. 一招破解 ...
- 【转】如何判断ARP欺骗?该怎么防护?
因为在进行通信的时候,数据是通过MAC地址与IP地址的对应关系来进行转发的.若其中MAC地址与IP地址对应的关系出错,就会导致数据错误转发,影响正常通信.通过某种手段,来更改MAC与IP地址的对应关系 ...
- nginx.exe启动错误:bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
启动nginx.ese之后 nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a soc ...
- 8.oop-多态
一.继承1.定义:子类继承父类,会继承父类的属性和方法2.语法:extends关键字 子类 extends 父类3.特点:java中的继承是单一继承,子类只能继承一个父类,但是父类可以有多个子类4.用 ...
- 用for循环打印九九乘法表(for嵌套循环)
package com.Summer_0416.cn; /** * @author Summer * */ public class Test_Method10 { public static voi ...
- Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记
进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...
- display:inline-block 来解决盒子高度不一样,造成的盒子浮动
<style> ul{ width: 320px; //给父元素添加这两个属性 font-size: 0px; text-align: center/left; } li{ width: ...
- .NET Core 中的路径问题
NET Core 应用程序相对于以前的.NET Framework 应用程序在启动运行的方式上有一定的差异,今天就来谈一谈这个获取应用程序启动路径的问题. 1.工作路径 WorkingDirector ...
- 基于注解处理器开发自动生成getter和setter方法的插件
昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...
- ML.NET 示例:聚类之客户细分
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...