centos8上安装Docker
本博文旨在让初次接触docker的小伙伴能有个基本的认识,能够掌握基本的概念并且安装和使用docker,前面介绍相关的内容可以跳过,直接看 docker安装部分。
Docker 简介
背景
开发和运维之间因为环境不同而导致的矛盾
集群环境下每台机器部署相同的应用
DevOps(Development and Operations)
简介
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 优点
简化程序: Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
避免选择恐惧症: 如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
节省开支: 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
Docker 架构
Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布,如图:
Host(Docker 宿主机)
安装了Docker程序,并运行了Docker daemon的主机。
Docker daemon(Docker 守护进程):
运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互。
Images(镜像):
将软件环境打包好的模板,用来创建容器的,一个镜像可以创建多个容器。
镜像分层结构:
位于下层的镜像称为父镜像(Parent Image),最底层的称为基础镜像(Base Image)。
最上层为“可读写”层,其下的均为“只读”层。
AUFS:
- advanced multi-layered unification filesystem:高级多层统一文件系统
- 用于为Linux文件系统实现“联合挂载”
- AUFS是之前的UnionFS的重新实现
- Docker最初使用AUFS作为容器文件系统层
- AUFS的竞争产品是overlayFS,从3.18开始被合并入Linux内核
- Docker的分层镜像,除了AUFS,Docker还支持btrfs,devicemapper和vfs等
Containers(容器):
Docker的运行组件,启动一个镜像就是一个容器,容器与容器之间相互隔离,并且互不影响。
Docker Client(Docker 客户端)
Docker命令行工具,用户是用Docker Client与Docker daemon进行通信并返回结果给用户。也可以使用其他工具通过Docker Api 与Docker daemon通信。
Registry(仓库服务注册)
经常会和仓库(Repository)混为一谈,实际上Registry上可以有多个仓库,每个仓库可以看成是一个用户,一个用户的仓库放了多个镜像。仓库分为了公开仓库(Public Repository)和私有仓库(Private Repository),最大的公开仓库是官方的Docker Hub,国内也有如阿里云、时速云等,可以给国内用户提供稳定快速的服务。用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker安装
Docker 提供了两个版本:社区版 (CE) 和企业版 (EE)收费,一般我们来用社区版本就够了。
操作系统
以Centos8为例,Docker 要求操作系统必须为64位,且centos内核版本为3.1及以上,
查看系统内核版本信息:
[wesley@wwk ~]$ uname -r
4.18.0-147.el8.x86_64
一、准备
我们直接去通过docker官网指引来安装吧
Developers->Docs->GetDocker->点击 Docker for Linux->左侧菜单点击 Install on CentOS
现在我们就来到了centos安装docker的页面,接下来,就按照指引来安装。
Uninstall old versions 卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
卸载后将保留 /var/lib/docker 的内容(镜像、容器、存储卷和网络等)需要删掉(如有)
rm -rf /var/lib/docker
安装之前先设置docker仓库
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
/linux/centos/
二、安装
安装最新版本 docker-ce
$ sudo yum install docker-ce docker-ce-cli
如果安装指定版本(可以忽略)
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.-3.el7 docker-ce-stable
#输入自己需要安装的版本
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING>
我这里安装报了一个错误
[wesley@wwk ~]$ sudo yum install docker-ce docker-ce-cli
[sudo] password for wesley:
Last metadata expiration check: 0:14:54 ago on Sun 19 Apr 2020 09:04:14 AM EDT.
Error:
Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires >= 1.2.2-3, but none of the providers can be installed
- cannot install the best candidate for the job
- package -1.2.10-3.2.el7.x86_64 is excluded
- package -1.2.13-3.1.el7.x86_64 is excluded
- package -1.2.2-3.3.el7.x86_64 is excluded
- package -1.2.2-3.el7.x86_64 is excluded
- package -1.2.4-3.1.el7.x86_64 is excluded
- package -1.2.5-3.1.el7.x86_64 is excluded
- package -1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
[wesley@wwk ~]$
原因是默认安装的 版本是 -1.2.0-3.el7.x86_64,而错误提示要求 >=1.2.2-3版本,
所以,我们需要先安装最新版本的 ,因为现在docker官网还是centos7,那我们就到centos7目录里面去找 ,发现最高版本是 -1.2.13-3.1.el7.x86_64.rpm
资源地址:/linux/centos/7/x86_64/stable/Packages/
安装 -1.2.13-3.1.el7.x86_64.rpm
[wesley@wwk ~]$ sudo dnf install /linux/centos/7/x86_64/stable/Packages/-1.2.13-3.1.el7.x86_64.rpm
然后再来尝试安装docker的俩包
[wesley@wwk ~]$ sudo yum install docker-ce docker-ce-cli
这个时候又会报一个冲突的错误(如果没有报错可以忽略)
Error: Transaction check error:
file /usr/share/man/man1/docker-attach. from install of docker-ce-cli-1:19.03.8-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+
file /usr/share/man/man1/docker-build. from install of docker-ce-cli-1:19.03.8-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+
file /usr/share/man/man1/docker-commit. from install of docker-ce-cli-1:19.03.8-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+
......
执行卸载操作,然后重新安装最新版,不报错就表明安装成功了。
[wesley@wwk ~]$ sudo yum remove podman-manpages-1.4.2-5.module_el8.1.0+237+
[wesley@wwk ~]$ sudo yum install docker-ce docker-ce-cli
查看docker版本(如果报错 bash: docker: command not found…,请检查是否有上面冲突的错误)
命令:docker version 或者 docker -v
[wesley@wwk ~]$ docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/. Is the docker daemon running?
三、启动
启动 docker
[wesley@wwk ~]$ sudo systemctl start docker
验证docker 是否正确安装,打印出:Hello from Docker! 就表示安装ok了。
[wesley@wwk ~]$ sudo docker run hello-world
[sudo] password for wesley:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
/
For more examples and ideas, visit:
/get-started/
四、配置镜像加速
这里使用阿里云的免费镜像加速服务,也可以使用其他如:时速云、网易云等
1.注册登录开通阿里云容器镜像服务
2.找到镜像中心-镜像加速器,复制自己的加速器地址
3.找到/etc/docker目录下的文件,没有则创建
[wesley@wesley ~]$ sudo mkdir -p /etc/docker
4.加入自己的加速器地址
sudo tee /etc/docker/ <<-'EOF'
{
"registry-mirrors": [""]
}
EOF
5.通知systemd重载此配置文件并重启
#重载此配置文件
sudo systemctl daemon-reload
#重启
sudo systemctl restart docker
6.设置docker自启动
[wesley@wwk docker]$ sudo systemctl enable docker
Created symlink /etc/systemd/system// → /usr/lib/systemd/system/.
Docker常用操作
查看docker所有命令
[wesley@wwk docker]$ docker commond --help
镜像常用操作
查看已下载镜像
sudo docker images
查找镜像,搜索docker hub网站镜像的详细信息
docker search 关键词
下载镜像
docker pull 镜像名:TAG
Tag表示版本,有些镜像的版本显示latest,为最新版本
删除镜像
docker rmi -f 镜像ID或者镜像名:TAG
删除指定本地镜像 -f 表示强制删除
获取元信息
docker inspect 镜像ID或者镜像名:TAG
获取镜像的元信息,详细信息
容器常用操作
运行
docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG
# --name 指定容器名,可自定义,不指定自动命名
# -i 以交互模式运行容器
# -t 分配一个伪终端,即命令行,通常-it组合来使用
# -p 指定映射端口,讲主机端口映射到容器内的端口
# -d 后台运行容器
# -v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
容器列表
docker ps -a -q
# docker ps查看正在运行的容器
# -a 查看所有容器(运行中、未运行)
# -q 只查看容器的ID
启动容器
docker start 容器ID或容器名
停止容器
docker stop 容器ID或容器名
重启容器
docker restart 容器ID或容器名
删除容器
docker rm -f 容器ID或容器名
# -f 表示强制删除
查看日志
docker logs 容器ID或容器名
进入运行容器
docker exec -it 容器ID或者容器名 /bin/bash
# 进入正在运行的容器并且开启交互模式终端
# /bin/bash是固有写法,作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动
bash。
# 也可以用docker exec在运行中的容器执行命令
拷贝文件
docker cp 主机文件路径 容器ID或容器名:容器路径 #主机中文件拷贝到容器中
docker cp 容器ID或容器名:容器路径 主机文件路径 #容器中文件拷贝到主机中
获取容器元信息
docker inspect 容器ID或容器名
docker常用命令
应用实例
Docker安装mysql
下载
#我这边下载的是5.7版本的,如果你想用最新版的,可以不用添加版本号
[wesley@wwk docker]$ sudo docker pull mysql:5.7
安装
#执行后生成一长串字符表明创建完成了
#第1行:将mysql容器的3306端口映射到主机的3306端口
#第2,3,4行是将mysql配置文件,数据文件,日志文件挂载到主机的指导目录,方便操作
docker run --name mysql -p 3306:3306 \
-v /mydata/mysql/conf:/etc/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
#查看是否启动成功
root@wesley wesley]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e21b208e3c3d mysql:5.7 "?? 17 hours ago Up 8 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
进入容器
#以交互模式进入mysql容器内部,docker exec -it [NAMES|CONTAINER ID] /bin/bash 可以是名称或容器id
#容器id只输入前几位能唯一标识即可
[root@wesley wesley]# docker exec -it mysql /bin/bash
root@e21b208e3c3d:/#
#mysql安装目录
root@e21b208e3c3d:/# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/mysql
字符编码
#mysql字符编码默认是拉丁的,编辑文件(此文件不存在需要创建)
vim /mydata/mysql/conf/
#将以下配置贴到
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
#将mysql重启
docker restart mysql
#验证mysql字符编码是否修改成功,进入mysql
docker exec -it mysql /bin/bash
#连接mysql
mysql -u root -p
#输入查询命令,有如下展示表明修改成功
show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
至此,mysql 5.7安装完成!
Docker安装redis
下载
#默认下载最新版本,如果需要下载指定版本可以到官网 /_/redis?tab=tags
[root@wesley wesley]# docker pull redis
安装
#先创建目录(因为默认是没有的)
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/
#执行如下命令,生成一串字符就表明安装完成
docker run --name redis -p 6379:6379 \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/:/etc/redis/ \
-d redis redis-server /etc/redis/
例如:
[root@wesley wesley]# docker run --name redis -p 6379:6379 \
> -v /mydata/redis/data:/data \
> -v /mydata/redis/conf/:/etc/redis/ \
> -d redis redis-server /etc/redis/
9d450bb47764c0a516391c9e6621ef573919a727d0136d90fa4ec1847b13d46d
连接redis
docker exec -it redis redis-cli
进入容器
docker exec -it redis /bin/bash
配置持久化
在配置持久化之前,我们先去官网看下都能进行哪些配置,documentation -> Configuration -> The self documented for Redis 5.0. 打开配置连接,即可看到所有的配置。
本次只配置持久化,其他配置说明自行google
vim /mydata/redis/conf/
在配置文件中添加一行: appendonly yes 即可.
重启redis容器
[root@wesley conf]# docker restart redis
redis
注意
我在配置持久化后重启报了一个异常:
Error response from daemon: Cannot restart container redis: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/mydata/redis/conf/\\\" to rootfs \\\"/var/lib/docker/overlay2/ac91df1486716e1adf1876173fc2f8849962b43ce9f61f24e8372b108e64b6d1/merged\\\" at \\\"/var/lib/docker/overlay2/ac91df1486716e1adf1876173fc2f8849962b43ce9f61f24e8372b108e64b6d1/merged/etc/redis/\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
我排查后发现是因为我安装redis的时候没用先建文件,直接执行了安装命令后创建的文件,而默认redis容器内部 /etc/redis/ 这个目录下面是没有文件的,进行挂载之后,生成的是一个的目录导致出错。这种情况的解决方案就是,先删除容器,然后重新安装下。
至此,redis 5.0 安装完成!