docker学习笔记一

时间:2023-03-09 00:57:18
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