在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服务器、网络、内存及存储等)予以抽象、转化后呈现出来, 打破实体间不可切割的障碍,使用户可以通过更好的方式来应用这些资源。
Docker是一个开源的应用容器引擎, 诞生2013年,最初是dotCloud 公司内部的一个业余项目。它基于Google公司推出的Go语言实现。 项目后来加入Linux基金会,遵从了Apache2.0协议,源代码托管在 Github 进行维护。
Docker自开源后受到广泛的关注和讨论,以至于dotcloud公司后来都改名为Docker Inc。Redhat已经在RHEL6.5中集成对Docker的支持, Google 也在Paas产品中广泛应用。
下面的图片比较了Docker和传统的虚拟化方式的不同之处,可见容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟化则是在硬件层面实现。
总结: 与传统的虚拟机相比,Docker的优势体现为启动速度快、占用体积小。
知乎上看到一个更加形象的例子:
Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。
1、首先下载阿里的yum镜像源
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2、到/etc/yum.repos.d下配置yum仓库,如果使用yum install 命令时报错,是因为环境变量 r e l e a s e v e r 找 不 到 , 需 要 把 配 置 文 件 里 的 releasever找不到,需要把配置文件里的 releasever找不到,需要把配置文件里的releasever全部替换为7
:%s/$releasever/7/g
yum clean all
4、将服务器上的软件包信息缓存到本地,以提高搜索安装软件的速度。
yum makecache
5、yum包更新
yum update # yum包更新
(2) 配置yum仓库安装Docker
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
(3) 安装Docker
$ yum install docker-ce -y
(4) 安装后查看Docker版本
$ docker -v
ustc说老牌的linux镜像服务提供者,ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/
编辑该文件:
$ vim /etc/docker/daemon.json
编辑以下内容,保存退出。
{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu…cn”],
}
修改配置文件之后要重启docker服务
systemctl命令是系统服务管理器指令。
启动Docker:
$ systemctl start docker
停止Docker:
$ systemctl start docker
重启Docker:
$ systemctl restart docker
查看Docker状态:
$ systemctl status docker
开机启动Docker:
$ systemctl enable docker
查看Docker概要信息:
$ docker info
查看Docker帮助文档:
$ docker --help
如果你需要从网络中查找需要的镜像,可以通过下面命令搜索:
$ docker search 镜像名称
拉取仓库就是从镜像仓库中下载镜像到本地。
按ID删除镜像
$ docker rmi 镜像ID
删除所有镜像(注意:``是反向单引号)
$ docker rmi `docker images -q`
查看所有正在运行的容器
$ docker ps
查看所有容器(即无论是否运行中)
$ docker ps -a
查看最后一次运行的容器
$ docker ps -l
查看停止的容器
$ docker ps -f status=exited
创建容器常用参数说明: docker run
(1) 交互式创建容器
$ docker load -i ubuntu.tar # 加载镜像
$ docker run -it --name=myubuntu ubuntu /bin/bash # 创建容器, exit退出当前容器
$ docker ps -a # 查看容器
(2) 守护方式创建容器
$ docker run -di --name=容器名称 镜像名称:标签 # 创建容器
$ docker exec -it 容器名称/容器ID /bin/bash # 登录守护容器交互环境的方式
docker search 2048
docker pull docker.io/blackicebird/2048
docker run -di --name 2048 -p 0.0.0.0:8000:80 docker.io/blackicebird/2048
d3e892a37ba4db08ed3af772c58ef75303b5f61a36734b5df10f3ac832cd0350
浏览器访问网址: http://127.0.0.1:8000, 访问效果如下:
停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)
docker start 2048_game
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或者目录 容器名称:容器目录
docker cp /etc/passwd 容器id:/tmp/ #将passwd拷贝到容器的/tmp/目录下
也可以将目录从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或者目录
$ docker pull tensorflow/tensorflow # 从镜像仓库拉取镜像
$ docker run -di --name tf tensorflow/tensorflow # 创建容器
$ docker cp /etc/passwd tf:/mnt/ # 将文件拷贝到容器/mnt/目录下
$ docker exec -it tf /bin/bash # 登录守护容器交互环境的方式查看
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。
创建容器,添加-v参数 后面为 宿主机目录: 容器目录,例如:
$ docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name myubuntu1 ubuntu
$ docker exec -it myubuntu1 /bin/bash
root@8e80ee93f4e1:/# cd /usr/local/myhtml/
root@8e80ee93f4e1:/usr/local/myhtml# ls
test
ctrl + d 退出交互式,并且退出容器
ctrl + p+q 退出交互式,但不退出容器
这是因为Redhat7的安全模块Selinux把权限禁掉了, 我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。
我们可以通过以下命令查看容器运行的各种数据,myubuntu1是容器的名称。
$ docker inspect myubuntu1
也可以执行下面的命令直接输出IP地址,myubuntu1是容器的名称
$ docker inspect --format=’{{.NetworkSettings.IPAddress}}’ myubuntu1
删除指定的容器,如果删除容器时,容器正在运行中,则先停止容器。
$ docker stop myubuntu1
$ docker rm myubuntu1
$ docker search mysql
$ docker pull mysql
$ docker run -di --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=‘123’ mysql
# 查看容器IP,IP: 172.17.0.2
$ docker inspect -format=’{{.NetworkSettings.IPAddress}}’ mysql
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口。
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码
$ docker exec -it mysql /bin/bash
root@664bda0fe52a:/# mysql -uroot -p123
# 创建用户westos,允许任意主机(%)远程登陆,登陆密码为123.
mysql> create user westos@’%’ identified by ‘123’;
# 授权westos@%用户, 允许操作任意数据库和任意数据表(.).
mysql> grant all privileges on . to ‘westos’@’%’;
# 修改账户密码加密规则并更新用户密码。
mysql> alter ‘westos’@’%’ identified with mysql_native_password by ‘123’;
# 重新加载用户授权表。
mysql> flush privileges;
mysql> ^DBye
root@664bda0fe52a:/# exit
远程登录MySQL
$ mysql -uwestos -p123 -h172.17.0.3
报错显示:
用户在连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。
[root@foundation0 ~]# mysql -uwestos -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory
mysql8 之前的版本中加密规则是 mysql_native_password
而在mysql8之后,加密规则是 caching_sha2_password
解决方法: 修改账户密码加密规则并更新用户密码
# 修改加密规则
ALTER USER ‘user’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE NEVER;
# 更新一下用户的密码
ALTER USER ‘user’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
我们可以通过以下命令将容器保存为镜像
$ docker commit mysql mysql:remote_login
我们可以通过下面命令将镜像保存为tar文件
$ docker save -o mysqlRemoteLogin.tar mysql:remote_login
$ docker load -i mysqlRemoteLogin.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复。
Dockerfile由多条指令组成,每条指令在编译镜像时执行相应的程序完成某些功能,由指令+参数组成,以逗号分隔,#作为注释起始符,虽说指令不区分大小写,但是一般指令使用大些,参数使用小写
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。’#’ 为 Dockerfile 中的注释。
对于开发人员:可以为开发团队提供一个完全一致的开发环境。
对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。
对于运维人员: 在部署时,可以实现应用的无缝移植。