docker学习笔记一

1 篇文章 0 订阅
1 篇文章 0 订阅

需求:

*因为最近公司私有化的项目有点多,而且环境各异,所以考虑的是用docker,直接把程序打成镜像,直接起容器跑的话,可以忽略环境依赖问题。这里会分章节去把自己的学习笔记放出来,这是第一章

对docker的简单理解

可以把下面两个图综合的看:Alt
Alt
两个图综合的看,先根据上图的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。谢谢观看。本集完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值