docker学习笔记一
需求:
*因为最近公司私有化的项目有点多,而且环境各异,所以考虑的是用docker,直接把程序打成镜像,直接起容器跑的话,可以忽略环境依赖问题。这里会分章节去把自己的学习笔记放出来,这是第一章
对docker的简单理解
可以把下面两个图综合的看:
两个图综合的看,先根据上图的client指令做个解释吧。
-
client 发送pull指令时
-
docker daemon接收到指令,先在本地images内查找是否有对应版本镜像,没有的话,去dockerhub上拉取,保存在本地(如果设置了自己的镜像仓库,需要登陆之后才能拉取)
-
先从registry拉取镜像,registry一般是dockerhub,dockerhub官网
-
镜像保存到本地images内。
-
client 发送run指令
-
docker daemn接收到指令,运行操作基本同上
-
docker 引擎在拿到镜像之后启动容器
-
client 发送build指令
-
对于build指令,一般是根据同级目录下的dockerfile生成镜像的时候会用到,下面讲到dockerfile的时候详细说
整体流程为:
- client发送pull指令,拉取基础镜像到本地image仓库,比如纯净版本的centos7.2
- client发送run指令,docker引擎从本地image仓库拿到镜像,启动容器
操作:
1. 安装环境
1.1 安装docker依赖
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
1.2 设置docker的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.3 可以查看所有仓库中所有docker版本,并选择特定版本安装
查看版本
list docker-ce --showduplicates | sort -r
由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
yum install docker-ce-17.12.0.ce
1.4 启动并加入开机启动
systemctl start docker
systemctl enable docker
2. 镜像操作
2.1 拉取镜像:
这里没有指定版本信息,所以拉取出来的就是最新版本
[root@0001 ~]# docker pull ubuntu
2.2 查看镜像:
[root@0001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 775349758637 5 weeks ago 64.2MB
2.3 导出镜像:
[root@0001 ~]# docker image save ubuntu > /tmp/ubuntu.tar
[root@0001 ~]# ls /tmp/ubuntu.tar
/tmp/ubuntu.tar
2.4 删除镜像:
[root@0001 ~]# docker image rm -f 775349758637
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Untagged: wu/ubuntu:latest
Deleted: sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c
[root@0001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
2.5 导入镜像:
[root@0001 ~]# docker image load -i /tmp/ubuntu.tar
Loaded image: ubuntu:latest
[root@0001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 775349758637 5 weeks ago 64.2MB
2.6 给镜像改名:
[root@0001 ~]# docker image tag 775349758637 test:v1
[root@0001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 775349758637 5 weeks ago 64.2MB
ubuntu latest 775349758637 5 weeks ago 64.2MB
3. 容器的管理
3.1 运行容器
3.1.1 交互式的容器
注: 交互式登出的时候,容器会退出关闭,比较适合于测试环境,是工具类容器
[root@0001 ~]# docker container run -it 08d05d1d5859
[root@0001 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96c67a1bd666 nginx:1.14 “nginx -g 'daemon of…” 7 minutes ago Up 7 minutes 80/tcp test_nginx
CONTAINER ID :容器的唯一号码(自动生成的)
NAMES : 容器的名字(可以自动,也可以手动指定)
例子:手工指定容器的名字启动
[root@0001 ~]# docker container run --name=“test_cent76” -it 08d05d1d5859
STATUS : 容器的运行状态,包括{Exited:关闭,Up:开启}
3.1.2 守护式容器
[root@0001 ~]# docker run -d --name=‘test_nginx’ nginx:1.14
Unable to find image ‘nginx:1.14’ locally
1.14: Pulling from library/nginx
27833a3ba0a5: Pull complete
0f23e58bd0b7: Pull complete
8ca774778e85: Pull complete
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14
96c67a1bd6663aa730302feabb31f009903fb21f64bff70a99edc8fcfd6aeaec
[root@0001 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7.7.1908 08d05d1d5859 3 weeks ago 204MB
查询容器的详细信息:
[root@0001 ~]# docker container inspect test_nginx
3.1.3 容器的应用场景
交互式容器:工具类的,主要是用于开发去测试,临时性的任务,但是测试完成之后退出,容器不自动删除,需要在启动的时候添加 --rm 参数
退出时,自动删除例子:
[root@0001 ~]# docker container run -it --name=“wu_cent76” --rm centos
[root@0001 ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c0ab6d5ddb7 centos “/bin/bash” About a minute ago Up 59 seconds wu_cent76
守护式容器:服务没法对外提供服务,需要做端口映射,主要是提供网络服务
对外提供服务,把容器内的80端口映射到宿主机的7798端口,例子:
[root@0001 ~]# docker container run -d -p 7798:80 --name=“wu_nginx_80” nginx:1.14
[root@0001 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a292ccb441 nginx:1.14 “nginx -g 'daemon of…” About a minute ago Up About a minute 0.0.0.0:7798->80/tcp wu_nginx_80
3.1.4 容器的启动/关闭/连接
守护式容器启动:
[root@0001 ~]# docker container stop c5a292ccb441
c5a292ccb441
[root@0001 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a292ccb441 nginx:1.14 “nginx -g 'daemon of…” 7 minutes ago Exited (0) 1 second ago wu_nginx_80
[root@0001 ~]# docker start c5a292ccb441
c5a292ccb441
[root@0001 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a292ccb441 nginx:1.14 “nginx -g 'daemon of…” 7 minutes ago Up 1 second 0.0.0.0:7798->80/tcp wu_nginx_80
交互式容器:在退出时,就已经停止了,只是还在docker内有状态,可以用下面的方式启动,关闭,连接
启动:
[root@0001 ~]# docker container start fd3395395af9
fd3395395af9
[root@0001 ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd3395395af9 centos “/bin/bash” 2 minutes ago Up 1 second wu_cent
关闭:
[root@0001 ~]# docker container stop fd3395395af9
fd3395395af9
[root@0001 ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd3395395af9 centos “/bin/bash” 2 minutes ago Exited (0) 2 seconds ago wu_cent
容器的连接方法:
下面这样在退出的时候,还是会关闭容器
注:要想不关闭容器,可以用 CTRL+P+Q 一起按,把容器放在后台,挂起,这样不会关闭容器
[root@0001 ~]# docker container attach wu_cent
[root@fd3395395af9 /]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
下面是子进程的方式登陆,退出时,不会关闭容器
[root@0001 ~]# docker container exec -it wu_cent /bin/bash
[root@fd3395395af9 /]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
- 容器的后台及前台运行:
- CTRL+P+Q 在attch 调用进前台后执行,可挂回后台
- 在启动的时候加死循环,如sleep 9999999
- 让程序前台一致允许(卡在运行状态,在前台显示,不结束的话,一直卡着),这是在制作守护式容器时,常用的方法
3.2 docker 容器的网络访问
指定映射:docker 会自动添加一条iptables规则来实现端口映射,写ip的话,只能本网段访问
-p hostPort:containerPort **********
-p ip:hostPort:containerPort **********
-p ip:containerPort(随机端口:32768-60999)
-p hostPort:containerPort/udp
-p 81:80 -p 443:443
例如:
[root@0001 ~]# docker container run -d -p 7798:80 --name=“wu_nginx_80” nginx:1.14
[root@0001 ~]# docker container run -d -p 192.168.1.12:7797:80 --name=“wu_nginx_81” nginx:1.14
[root@0001 ~]# docker container run -d -p 192.168.1.12::80 --name=“wu_nginx_82” nginx:1.14
上面的可简化为:
[root@0001 ~]# docker container run -d -p 80 --name=“wu_nginx_82” nginx:1.14
[root@0001 ~]# docker container run -d -p 7796:53/udp --name=“wu_nginx_83” nginx:1.14
[root@0001 ~]# docker container run -d -p 7795:80 -p 7794:80 --name=“wu_nginx_84” nginx:1.14
3.3 容器的其他管理
docker ps -a -q -l # -a 查所有 -q 查ID -l 查最新的
docker ps -a -q == docker container ls -a -q
查询容器内进程:
[root@0001 ~]# docker container top wu_cent
UID PID PPID C STIME TTY TIME CMD
root 1565 1546 0 11:55 ? 00:00:00 /bin/bash
[root@0001 ~]# docker container top wu_nginx_80
UID PID PPID C STIME TTY TIME CMD
root 5761 5744 0 13:01 ? 00:00:00 nginx: master process nginx -g daemon off;
101 5804 5761 0 13:01 ? 00:00:00 nginx: worker process
查询容器内的日志,可在logs 后加 -t/-f/-tf 也可以在-tf 后加 --tail 10 行数:
[root@0001 ~]# docker container logs -t wu_nginx_80
[root@0001 ~]# docker container logs -f wu_nginx_80 # 只是-f的话,会卡住,一直显示
[root@0001 ~]# docker container logs -tf wu_nginx_80
[root@0001 ~]# docker container logs -tf --tail 10 wu_nginx_80
[root@0001 ~]# docker container logs -tf --tail 0 wu_nginx_80
[root@0001 ~]# docker container logs wu_nginx_80
- - [07/Dec/2019:03:38:08 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-"
- - [07/Dec/2019:03:38:08 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://:7798/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-"
2019/12/07 03:38:08 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 120.244.146.43, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: ":7798", referrer: "http://:7798/"
- - [07/Dec/2019:05:01:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-"
172.17.0.4 - - [07/Dec/2019:05:22:09 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.61.1" "-"
3.4 docker 的数据卷实现持久化存储
3.4.1 手工交互数据:这种主要是在宿主机和容器之间互相拷贝数据的:
宿主机往容器内部拷贝:
[root@0001 ~]# docker container cp index.html n1:/usr/share/nginx/html/
从容器内拷贝到宿主机:
[root@0001 ~]# docker container cp n1:/usr/share/nginx/html/50x.html ./
3.4.2 Volume 实现宿主机和容器的数据共享
2.4.2.1 在启动的时候添加 -v src_dir:dst_dir 指定宿主机目录对应的容器目录,以实现数据同步
[root@0001 ~]# docker container run -d -p 7798:80 --name="n1" -v /root/html:/usr/share/nginx/html nginx
[root@0001 ~]# docker container run -d --name="n2" -p 7799:80 -v /root/html:/usr/share/nginx/html nginx
查看容器的挂载点,在详细信息的mount里,有宿主机路径和容器路径:
[root@0001 ~]# docker container inspect n1 | grep Mounts -A8
“Mounts”: [
{
“Type”: “bind”,
“Source”: “/root/html”,
“Destination”: “/usr/share/nginx/html”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
3.4.2.2 上面的方法适用于少量机器挂载,但是实际使用中,可能会挂载很多,就需要先做数据卷容器
3.4.2.2.1. 宿主机模拟数据目录:
[root@0001 html]# mkdir /root/html/a /root/html/b
[root@0001 html]# echo 123 > /root/html/a/index.html
[root@0001 html]# echo 456 > /root/html/b/index.html
[root@0001 html]# tree /root/html/
/root/html/
├── a
│ └── index.html
├── b
│ └── index.html
3.4.2.2.2. 宿主机启动数据卷容器:
[root@0001 html]# docker container run -it --name “nginx_volumes” -v /root/html/a:/root/a -v /root/html/b:/root/b centos /bin/bash
注:这里是交互式启动的,不要CTRL+D退出,那样启动的容器就DOWN了。按CTRL+P+Q 可挂起容器
[root@88443db63a55 /]# ls /root/a
index.html
[root@88443db63a55 /]# ls /root/b
index.html
在宿主机上查看启动的容器状态:
[root@0001 html]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88443db63a55 centos “/bin/bash” 26 minutes ago Up 26 minutes nginx_volumes
3.4.2.2.3. 使用数据卷容器
[root@0001 html]# docker container run -d -p 8085:80 --volumes-from nginx_volumes --name=“n8085” nginx
5ebf677be9c8efa6687db5f8361a3475ac5c7d872341d4072dd363d4ba30068e
[root@0001 html]# docker container run -d -p 8086:80 --volumes-from nginx_volumes --name=“n8086” nginx
c09f48be16a4a3cae3e9dc11e8968d91d12b9f889123d51951675ac6074ab239
[root@0001 html]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c09f48be16a4 nginx “nginx -g 'daemon of…” 18 seconds ago Up 17 seconds 0.0.0.0:8086->80/tcp n8086
5ebf677be9c8 nginx “nginx -g 'daemon of…” 32 seconds ago Up 31 seconds 0.0.0.0:8085->80/tcp n8085
作用: 在集中化管理集群/分布式集群这样的大批量的容器,都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一挂载管理。
好了,这一章,就先到这里。下一章是dockerfile。谢谢观看。本集完。