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是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
随机推荐
- 第一章 mysql的体系结构与存储引擎
数据库从逻辑上可以分为两部分,一部分负责存储即文件系统,这部分有个更时髦的名字叫存储引擎,存储引擎负责如何把数据以及索引相关的内容以合适的形式组织并存储到磁盘上.另一部分为server部分,负责和用户 ...
- [LeetCode]最大系列(最大正方形221,最大加号标志764)
221. 最大正方形 题目描述: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 ...
- 微信硬件平台(八) 3 ESP8266向微信服务器请求设备绑定的用户
https://api.weixin.qq.com/device/get_openid?access_token=自己申请微信token&device_type=gh_e93c1b3098b9 ...
- ORA-00600: internal error code, arguments: [2662]
转自 http://www.eygle.com/archives/2005/12/oracle_diagnostics_howto_deal_2662_error.html 在ORA-00600 22 ...
- 使用webstrom开发react-native时react-native代码会出现红色下划线的解决方法
问题:使用webstrom开发react-native时react-native代码会出现红色下划线的解决方法 解决方法:webstrom ->preferences->Laugrange ...
- .net ElasticSearch-Sql 扩展类【原创】
官方提供的是java sdk,并支持jdbc方式的查询结果输出;但是却没有.net sdk的支持. 开发 ElasticSearch-Sql 第三方开源项目的.net sdk,未来集成入bsf框架.( ...
- 记上海技术交流会之行备忘录(superset与odoo整合)
像每个早上一样,早起跑步回来冲个热水澡,简单的吃下早饭,看书到8:50的样子,准备赶10:02分的火车.在我看到周总的微信时,我知道这将是一个新的起点,在自己过往的2年时间,将更多的精力和时间用在了英 ...
- Spring_AOP 记录系统关键操作日志用法
问题: 系统需要记录用户的关键操作日志,以便后期的系统维护,方便的查看问题,及时排除 分析: (1)保存字段:作为一个日志记录功能,首先数据库新建一张表保存用户的操作关键字段, 用户名,ip,操作描述 ...
- (通用版)salesforce中soql及sosl的伪‘Like’模糊检索
salesforce里有soql.sosl两种查询语法,soql针对模糊搜索也有‘like’关键字,然而只能针对其自带字段如:Name.Id:对于自定义添加的字段如:Message__c.Note__ ...
- C#泛型创建实例
class Test<T> where T : new() { public static T Instance() { return new T(); } } 就上面这方法, 居然比ne ...