Docker简介及基本使用

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有三大核心要素:仓库、镜像、容器,三者之间的关系如下图所示:
Docker简介及基本使用

  • 镜像:包含了代码及其运行环境的包,类似于操作系统的ISO文件,是静态文件;
  • 容器:镜像运行后即是容器,可以对外提供服务;
  • 仓库:存储镜像的地方,类似于yum仓库,包括共有仓库如DockerHub和国内的阿里、网易等;私有仓库,如我们自己搭建的,可以搭建私有仓库的开源软件有官方推荐的Registry和比较著名的Harbor等。

镜像是容器和仓库的桥梁,容器与仓库没有直接关系,他们是通过镜像建立联系的。
Docker简介及基本使用
我们要运行一个容器,就要从仓库中拉取对应的镜像,然后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
Docker简介及基本使用

 

 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的使用,如何制作一个自己的镜像?敬请关注。

Docker简介及基本使用

上一篇:前后端数据交互(五)——什么是 axios?


下一篇:在 linux 下使用 CMake 构建应用程序