1. docker简介
学习一门技能或新的技术,我认为至少要明白三件事:
- 这个东西是什么?
- 为什么会出现,能够为我们解决什么问题?
- 我们如何使用它?
至于为什么会出现,大家可以自行百度或查阅官方文档,很多大牛们都有介绍,比我解释的更好,在此就不多做啰嗦,本着实践的原则,本文中只描述docker的出现为我们解决了什么问题,以及我们怎么样使用它。
在2000年左右入行运维的同学大多数应该遇到过这么一个问题:
同一套代码,开发环境、测试环境反复测试都没有问题,一上线就出现各种各样的问题。对于这类问题之前也做过总结,无非就是配置问题或环境问题,开发、测试、生产环境不一致,导致每次代码发布一堆人熬夜到很晚才能完成,效率根本谈不上。
docker的出现为我们很好的解决了上述问题,所以得以被国内外的同行们认可,能够快速的发展,它能将代码连同运行环境,打包成一个镜像,同一个镜像可以在开发、测试、生产等各个环境进行部署。
同时,可以做到不同的容器之间相互隔离,对于每个容器用到的资源也可以进行限制。
当然,要实现这种部署方式,还离不开代码与配置分离、无状态化改造等等一系列的工作作为前提。但是好就好在这些都是一次性的工作,在后续的文章中,我也会有相关的文章分享出来。
2. docker基础操作
本文主要描述在CentOS7.8操作系统上面安装和配置docker,其他Linux发行版与之类似,因篇幅有限,不区分环境介绍。如在安装配置过程中遇到问题,可留言或加入博客中公布的QQ群进行交流。
2.1. docker安装
2.1.1 配置网卡转发
# 若未配置,需要执行如下 cat <<EOF > /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward=1 EOF sysctl -p /etc/sysctl.d/docker.conf # 如果出现如下报错: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory # 解决,先执行命令: modprobe br_netfilter # 然后再次执行如下命令即可 sysctl -p /etc/sysctl.d/docker.conf
2.1.2 yum安装docker
# 1)下载阿里源repo文件 curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel-aliyun.repo http://mirrors.aliyun.com/repo/epel-aliyun.repo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum clean all && yum makecache fast # 2)查看源中可用版本 yum list docker-ce --showduplicates | sort -r # 3)yum安装指定版本docker yum install docker-ce-20.10.8 -y ## 安装旧版本:# yum install -y docker-ce-18.09.9 ## 安装最新版:# yum install docker-ce # 4)配置源加速(阿里云:容器镜像服务 - 镜像加速) # 或直接访问如下连接,输入帐号密码即可获取自己的镜像加速地址 ## https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors mkdir -p /etc/docker vi /etc/docker/daemon.json { "registry-mirrors" : [ "https://7ro8ynda.mirror.aliyuncs.com" ] } # 5)设置开机自启 systemctl enable docker systemctl daemon-reload # 6)启动docker systemctl start docker # 7)查看docker信息 docker info ps -ef |grep docker systemctl status docker # containerd ps -ef |grep containerd systemctl status containerd
2.2 docker 常用操作
2.2.1 docker核心要素
docker有三大核心要素:仓库、镜像、容器,三者之间的关系如下图所示:
- 镜像:包含了代码及其运行环境的包,类似于操作系统的ISO文件,是静态文件;
- 容器:镜像运行后即是容器,可以对外提供服务;
- 仓库:存储镜像的地方,类似于yum仓库,包括共有仓库如DockerHub和国内的阿里、网易等;私有仓库,如我们自己搭建的,可以搭建私有仓库的开源软件有官方推荐的Registry和比较著名的Harbor等。
镜像是容器和仓库的桥梁,容器与仓库没有直接关系,他们是通过镜像建立联系的。
我们要运行一个容器,就要从仓库中拉取对应的镜像,然后run起来,就成了可对外提供服务的容器。
2.2.2. 镜像常用操作
# 查看镜像列表 docker images # 或者 docker image ls # 获取镜像(两个途径:从共有仓库获取,从私有仓库获取,默认从dockerHub仓库获取镜像 docker pull nginx:alpine # 完整的写法是: docker pull docker.io/library/nginx:alpine # 为镜像打标签 docker tag nginx:alpine 10.168.215.55:5000/nginx:alpine # 说明:10.168.215.55:5000是我自己用Registry搭建的私有仓库 # 根据Dockerfile构建一个自己的镜像(先预览一下,后面详细说明) docker build . -t my-nginx:ubuntu -f Dockerfile
2.2.3. 容器常用操作
# 通过镜像启动容器(启动容器放后台运行) docker run --name my-nginx -d nginx:alpine # 查看容器列表 docker ps docker ps -a # 包含已经退出的容器 # 进入一个已经启动的容器内部 docker exec -ti my-nginx2 /bin/sh # 启动并进入容器(退出后,容器也退出状态) docker run -ti --name my-nginx3 nginx:alpine /bin/sh # 启动并进入容器,并且在退出容器后自动删除(测试某项功能的时候经常用到) docker run -ti --rm nginx:alpine /bin/sh / # ps PID USER TIME COMMAND 1 root 0:00 /bin/sh 7 root 0:00 ps # 停止一个容器(此时容器为Exited状态) docker stop my-nginx # 启动一个停止的容器 docker start my-nginx # 删除一个退出Exited状态的容器(正在运行的容器这种方式是删不掉的) docker rm my-nginx # 强制删除一个正在运行的容器 docker rm -f my-nginx-alpine # 将容器内的端口映射到宿主机提供服务 -p <host_port>:<container_port> docker run --name nginx -d -p 8080:80 nginx:alpine # 资源限制,最大可用内存500M docker run --memory=500m nginx:alpine # 容器数据持久化 - 挂载主机目录 docker run --name nginx -d -v /opt:/opt nginx:alpine docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7 # 容器与宿主机之间数据拷贝 docker cp /tmp/test.txt nginx:/tmp # 容器拷贝到主机 docker cp nginx:/tmp/test.txt ./ # 查看容器日志 docker logs my-nginx docker logs -f my-nginx docker logs --tail=100 -f my-nginx # 容器的详细信息查看 docker inspect my-nginx # 镜像的详细信息查看 docker inspect nginx:alpine
2.2.4 介绍一个界面管理docker工具portainer
我们运行docker后,会默认在/var/run下面有个docker.sock,这个工具就是根据这个sock文件来访问和管理本地的docker,使用方法如下:
docker run --name portainer -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
然后访问 ip:9000
2.3 docker操作补充
# 利用Registry搭建本地docker仓库 docker run -d -p 5000:5000 --restart always --name registry registry:2 # 将本地仓库加入docker配置文件daemon.json中 cat /etc/docker/daemon.json { "graph": "/data/docker", "registry-mirrors": ["https://7ro8ynda.mirror.aliyuncs.com"], "insecure-registries": ["10.168.215.55:5000"], } # 重启docker服务 systemctl restart docker # 上传镜像到本地仓库 docker push 10.168.215.55:5000/nginx:alpine # 导出镜像到文件中 docker save -o nginx-alpine.tar nginx:alpine # 从文件中加载镜像 docker load -i nginx-alpine.tar # 删除镜像 docker rmi nginx:alpine
后面的文章会介绍Dockerfile的使用,如何制作一个自己的镜像?敬请关注。