docker学习日志一

知识点:

1)docker简介

2)docker安装,仓库配置

3)docker仓库镜像拉取,导出,导入,删除

4)docker容器操作,容器的创建,删除,运行,停止,日志查看等。

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客户端,参考文档 docker-ce

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... 4141 [OK] 
docker.io docker.io/mhart/alpine-node Minimal Node.js built on Alpine Linux 374 
docker.io docker.io/anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.23 over... 342 [OK]
docker.io docker.io/gliderlabs/alpine Image based on Alpine Linux will help you ... 176 
docker.io docker.io/frolvlad/alpine-glibc Alpine Docker image with glibc (~12MB) 160 [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 7 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 7 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 7 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 "123" >test.txt 
/tmp # cat test.txt 
123
/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" 5 minutes ago Exited (0) 3 minutes ago trusting_jepsen
15d3cc7d3ee3 alpine "sh" 10 minutes ago Exited (0) 10 minutes ago romantic_babbage
ea181e0f32bc alpine "sh" 16 minutes ago Exited (0) 11 minutes ago affectionate_knuth
d212402edb3a alpine "echo 'Hello World..." 16 minutes ago Exited (0) 16 minutes ago angry_mestorf
24e088998106 alpine "echo 'Hello World'" 17 minutes ago Exited (0) 17 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'" 22 minutes ago Exited (0) 22 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 4 weeks ago 109 MB

一个xshell端创建开启nginx容器,再打开一个xshell窗口查看状态。

[root@mytest logs]# docker run -it --name mynginx nginx

[root@mytest ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cda2a66dfee7 nginx "nginx -g 'daemon ..." 12 seconds ago Up 12 seconds 80/tcp mynginx

(此处nginx使用了80端口,但是没用对外进行映射操作,所以在物理机是没办法访问的)

查看容器详细信息

[root@mytest ~]# docker inspect mynginx

...
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ae19237eb78229aae43ce516e47c5f44c37343968163ff6c18b79b50dab8c164",
"EndpointID": "f12ed55420d5217f61656034665bd0671e9b076a097d45882294dcacd21636e6",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
...

可以看到ip地址是172.17.0.2
然后访问该IP,效果如下:

[root@mytest ~]# curl -I http://172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.15.2
Date: Tue, 28 Aug 2018 09:08:08 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 24 Jul 2018 13:02:29 GMT
Connection: keep-alive
ETag: "5b572365-264"
Accept-Ranges: bytes

同时另一个xhell窗口可以看到如下访问信息

[root@mytest logs]# docker run -it --name mynginx nginx
172.17.0.1 - - [28/Aug/2018:09:08:08 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"

进入正在运行的容器

[root@mytest ~]# docker exec -it mynginx sh
#

-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 ..." 26 seconds ago Up 26 seconds 80/tcp mynginx

停止后台运行的docker容器

[root@mytest logs]# docker stop mynginx
mynginx

查看容器后台访问日志

[root@mytest logs]# docker logs mynginx
172.17.0.1 - - [28/Aug/2018:09:41:10 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

实时动态查看docker容器日志

[root@mytest logs]# docker logs mynginx -f

猜你喜欢

转载自www.cnblogs.com/dannylinux/p/9549942.html