为什么要使用Docker?
场景一:公司双十一买了一堆服务器,技术总监让你给它们一个个都配置上JDK、Mysql、Redis等软件环境。
你心里小声嘀咕:“这总监不讲武德!“然后你开始一个个去安装、配置,结果搞了一天都没有配置好。
到了晚上10点,总监对你说:“你到底行不行?我劝你好自为之!“
场景二: 你和公司同事共用一台服务器进行开发,中间突然你俩的程序都挂了。
同事很恼火,拿着键盘指着你说:“怪不得总监昨晚劝你好自为之,我看你就是不行!”
你一听不行,脑子就炸了!“男人不能说不行啊!“你上去就给了他一拳。
那么有了Docker以后,以上两个场景会变成怎样?
场景一变为:你在Docker Hub(镜像仓库)上下载了这些软件的镜像,然后
在容器里通过 docker run这个简单的命令一个个运行它们,不到5分钟你就全部配置好了。
总监对你连连点头:“小伙子不错嘛,也是一个老Docker了!“
场景二变为:你和同事的程序分别运行在两个互不干扰的容器里,即便同事的程序挂了,你的程序依然毫发无损。同事从此对你刮目相看。
01 什么是 Docker
1. Docker的英文解释是:容器。你可以把它想象为运输船上的集装箱,它们互相隔离、互不干扰。
Docker官网的图标是一个鲸鱼身上有一堆小箱子,这些小箱子就是容器。
到这里你可能想问?为什么你一直在说容器?为什么容器技术越来越重要?为什么Docker这么火?
“因为Docker它超级轻啊!“
在容器技术之前,业内用的最多的就是虚拟机技术,其中虚拟技术的代表就是VMware。
那么什么是虚拟技术?其实就是在你的电脑上先安装一个软件例如VMware,然后再在这个软件上安装一堆“子电脑”,这些“子电脑”就是虚拟机,它们一般常用的是CentOS。
在这些子电脑上,你可以运行eclipse、网易云音乐等各种软件。你还可以在一台虚拟机上用navicat连接另外一台虚拟机上的Mysql。
想必各位在大学里面学习Linux这门课的时候,都学过怎样在电脑上装Linux系统。
首先是在你的电脑上装VMware,事先老师可能给你们找了一个绿色破解版的,所以装起来并不是很难。
但是等到装CentOS的时候,有的同学就崩溃了,一节课一个班里可能最多只有一半人装成功了,有的甚至到大学毕业了还没有成功过。图片
虚拟机技术虽然可以在一台真实的电脑上通过一个软件装一堆虚拟的“子电脑”,但是它安装起来太麻烦了,而且启动起来超级超级慢,最重要的是特别卡,很占内存。关键时刻,容器技术的主角Docker闪亮登场。
首先我们来看一张虚拟机技术和Docker容器技术的对比图
由上图可知:就是因为Docker启动超级快,占用内存超级低,所以它才会越来越受欢迎。
2. Docker的核心
镜像:一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像等。
容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,运行镜像其实就是安装软件。
仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置。
举个例子:
在很久之前程序员开发完一个软件只能通过开发工具把软件安装在手机上,且不说软件安装起来有多麻烦,有的手机还不兼容,大多数人都不能共享这个软件。
结果有一天有一个牛人搞了一个应用商店,所有的程序员只要遵守一定的规范,他们都可以把自己开发的软件打包发布到应用商店上。然后所有人都可以在这个应用商店上下载软件。
在刚才的例子里,所有的程序员打包发布的软件就是“Docker镜像”,而应用商店就是Docker的仓库。我们在手机上运行的软件就是Docker容器。
说白了就是所有人都可以发布Docker镜像到Docker仓库里,都可以从Docker仓库里下载别人发布的镜像,然后将这些镜像一运行就成为了一个Docker容器。这个Docker容器里面是一个配置好的软件环境。
02 安装Docker
1. 卸载之前的Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装Docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
设置docker的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装最新版本的的Docker
sudo yum install docker-ce docker-ce-cli containerd.io
安装完成之后查看Docker的版本:docker version
[root@eclipse ~]# docker version
Client: Docker Engine - Community
Version: 20.10.0
API version: 1.41
Go version: go1.13.15
Git commit: 7287ab3
Built: Tue Dec 8 18:57:35 2020
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
因为Docker镜像仓库的服务器在国外,由于网络等一些其他原因我们访问起来会比较慢,所以这里需要配置docker的阿里云镜像加速服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
然后重启Docker
sudo systemctl restart docker
配置完之后查看docker的阿里云镜像是否生效
[root@eclipse ~]# docker info
Client:
Context: default
Debug Mode: false
Experimental: false
Insecure Registries:
.....................
127.0.0.0/8
Registry Mirrors:
https://lz2nib3q.mirror.aliyuncs.com/
Live Restore Enabled: false
03 Docker常用命令
Docker常用命令主要包含镜像命令、容器命令以及进入容器内部与软件环境的交互命令。
1 镜像命令
1.1 查看所有镜像 docker images
-a 列出所有镜像 -q 只显示镜像id
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f35646e83998 8 weeks ago 133MB
1.2 搜索镜像 docker search 镜像名
[root@eclipse ~]# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8843 [OK]
bitnami/redis Bitnami Redis Docker Image 168 [OK]
sameersbn/redis 82 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0 72
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 48 [OK]
1.3.从仓库下载镜像
docker pull 镜像名
[root@eclipse ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete
29969ddb0ffb: Pull complete
a43f41a44c48: Pull complete
5cdd802543a3: Pull complete
b79b040de953: Pull complete
938c64119969: Pull complete
7689ec51a0d9: Pull complete
a880ba7c411f: Pull complete
984f656ec6ca: Pull complete
9f497bce458a: Pull complete
b9940f97694b: Pull complete
2f069358dc96: Pull complete
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
1.4.删除镜像 docker rmi 镜像名
-f 强制删除
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest dd7265748b5d 2 weeks ago 545MB
nginx latest f35646e83998 8 weeks ago 133MB
[root@eclipse ~]# docker rmi -f mysql
2 容器命令
2.1 运行容器 docker run 镜像名
--name 为容器起一个别名 -d 在后台启动容器 -p 对外暴露端口号:容器端口号
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest dd7265748b5d 2 weeks ago 545MB
nginx latest f35646e83998 8 weeks ago 133MB
[root@eclipse ~]# docker run -d -p 3306:3306 mysql
2.2 查看运行的容器 docker ps
-a 正在运行的以及历史运行过的容器 -q 只显示容器编号
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10fddd372a62 mysql "docker-entrypoint.s…" 6 minutes ago Exited (1) 6 minutes ago strange_maxwell
844ff32beda2 42a1947ab396 "/docker-entrypoint.…" 6 weeks ago Exited (0) 5 weeks ago inspiring_ishizaka
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Exited (0) 6 weeks ago frosty_keller
[root@eclipse ~]# docker ps -a -q
10fddd372a62
844ff32beda2
cb5814efd6da
[root@eclipse ~]#
2.3 开启|重启|停止容器
docker start 容器名或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 22 seconds ago Up 22 seconds 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]# docker stop 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]# docker start 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 52 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]#
2.4 删除容器 docker rm -f 容器id或者容器名
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 2 minutes ago Up About a minute 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]# docker rm -f 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]#
2.5查看容器内进程 docker top 容器id或者容器名
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 29 seconds 80/tcp frosty_keller
[root@eclipse ~]# docker top cb5
UID PID PPID C STIME TTY TIME CMD
root 11243 11223 0 22:21 ? 00:00:00 nginx: master process nginx -g daemon off;
101 11288 11243 0 22:21 ? 00:00:00 nginx: worker process
[root@eclipse ~]#
2.6查看容器的运行日志 docker logs 容器id或容器名
-t 引入时间戳 -f 跟随最新的日志打印 --tail 数字 显示最后多少条
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 2 minutes 80/tcp frosty_keller
[root@eclipse ~]# docker logs cb5 -t -f --tail 5
2020-12-10T14:21:32.392176888Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2020-12-10T14:21:32.399762487Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2020-12-10T14:21:32.402023731Z 10-listen-on-ipv6-by-default.sh: error: IPv6 listen already enabled
2020-12-10T14:21:32.404200667Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
2020-12-10T14:21:32.413931054Z /docker-entrypoint.sh: Configuration complete; ready for start up
3 进入容器内部执行命令
3.1 进入容器内 docker exec 容器id
-i 以交互模式运行容器 -t 分配终端窗口 /bin/bash
传统模式下我们安装完软件之后可以直接进入到它的安装目录下,然后执行这个软件的相关命令。
使用Docker之后,运行的Docker容器里面包含了一个软件环境,所以我们需要先进入到容器里面的软件环境内部,然后才能执行这个软件的相关命令。
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 16 minutes 80/tcp frosty_keller
[root@eclipse ~]# docker exec -it cb5 /bin/bash
root@cb5814efd6da:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@cb5814efd6da:/#
3.2退出容器 exit
[root@eclipse ~]# docker exec -it cb5 /bin/bash
root@cb5814efd6da:/# exit
exit
[root@eclipse ~]#
3.3我们可以将镜像打成压缩包
docker save 镜像名 -o 名称.tar
3.4我们还可以载入镜像
docker load -i 名称.tar
04 Docker安装常用软件
1安装mysql
1.1 拉取mysql镜像
docker pull mysql
1.2 运行mysql服务
这里设置账户和密码都是root
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
1.3 进入mysql容器
docker exec -it 容器id /bin/bash
[root@eclipse ~]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
977b216cf344257d268ee0cf4e5f20d892bb6619787f64c5791bc5d4a4309af4
[root@eclipse ~]# docker exec -it 977 /bin/bash
root@977b216cf344:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
1.4 将容器数据位置与宿主机位置挂载保证数据安全
docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
2 安装MongoDB数据库
2.1 拉取Mongo镜像
docker pull mongo
2.2 运行MongoDB镜像
其实就是安装Mongo。-v后面的参数表示把数据文件挂载到宿主机的路径,-p把mongo端口映射到宿主机的指定端口,--auth表示连接mongodb需要授权。
$ docker run -d --name mongo -p 27017:27017 mongo --auth
2.3 以admin身份进入到mongo内部
$ docker exec -it mongo mongo admin
# 创建admin管理员账户
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 对admin进行身份认证
> db.auth('admin', '123456')
2.4 将mongoDB中数据目录映射到宿主机中
docker run -d -p 27017:27017 -v /root/mongo/data:/data/db --name mymongo mongo
2.5 连接Mongo
微信公众号:eclipse编程。专注于编程技术分享,坚持终身学习。