为什么要使用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编程。专注于编程技术分享,坚持终身学习。

人均年薪50万以上,docker到底是什么?为什么这么火?的更多相关文章

  1. 如何成为一名成功的iOS程序员,挑战年薪50万?

    编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域.你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识.只是对编程感兴趣还不足以功成名就——众所周知,我们工作起来像疯子. 编程是一个没有极限的职业,所 ...

  2. 想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验--阿里mike

    想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构师之路有一定的参考. ...

  3. 编程排序的一个excel-据说玩的好的,年薪50万了。只是你没在对的地方

    是一个excel 下面是百度网盘分享地址; http://pan.baidu.com/s/1kTwqRfL    

  4. 传智播客C/C++学院年薪24-50万招聘C/C++讲师

    C/C++技术讲师 6名 (北京,年薪:24-50万) 传智播客C/C++课程培训体系如下: 1.C语言,世界五百强C语言面试训练 2.C++语言,世界五百强C++语言面试训练 3.数据结构与算法,世 ...

  5. 两个offer如何做选择?年薪20万vs年薪15万

    (附注:本文转载于:http://www.eoeandroid.com/thread-296678-1-1.html) 前些天和一个年轻的朋友谈跳槽.朋友说她需要在两个offer里面做选择.一个是年薪 ...

  6. 超有料丨小白如何成功逆袭为年薪30万的Web安全工程师

    今天的文章是一篇超实用的学习指南,尤其是对于即将毕业的学生,新入职场的菜鸟,对Web安全感兴趣的小白,真的非常nice,希望大家能够好好阅读,真的可以让你少走很多弯路,至少年薪30万so easy! ...

  7. 落实制度靠流程<摘自平安50万人的执行力>

     落实制度靠流程<摘自平安50万人的执行力> 讲在嘴上的制度是给人听的,写在纸上的制度是给人看的,落实在流程上的制度才是可靠的.制度的执行不能都依赖个人的自觉性. 很多企业都在强调和推行制 ...

  8. (转载) 据说年薪30万的Android程序员必须知道的

    据说年薪30万的Android程序员必须知道的帖子 标签: android 2015-03-12 16:52 28705人阅读 评论(14) 收藏 举报 Android中国开发精英 目前包括: And ...

  9. docker到底比LXC多了些什么

    看似docker主要的OS级虚拟化操作是借助LXC, AUFS只是锦上添花.那么肯定会有人好奇docker到底比LXC多了些什么.无意中发现 stackoverflow 上正好有人问这个问题, 回答者 ...

随机推荐

  1. PPT 转 word

    可以wps  直接转 打开wps   在页面里直接点击右键  可以导出wps

  2. 【Java基础】Java10 新特性

    Java10 新特性 局部变量类型推断 局部变量的显示类型声明,常常被认为是不必须的. 场景一:类实例化时.在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器. 场 ...

  3. LeetCode498 对角线遍历

    给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...

  4. 微信小程序API交互的自定义封装

    目录 1,起因 2,优化成果 3,实现思路 4,完整代码 1,起因 哪天,正在蚂蚁森林疯狂偷能量的我被boss叫过去,告知我司要做一个线上直播公开课功能的微信小程序,博主第一次写小程序,复习了下文档, ...

  5. 【Linux】rsync的相关用途

    Rsync,代表"remote sync",它是本地和远程主机文件同步工具.它只同步更改的文件,以此实现最小化传输数据. 我使用Ubuntu 16.04做为例子,但是你可以把它应用 ...

  6. 浏览器performance工具介绍及内存问题表现与监控内存的几种方式

    一.GC的目的 为了实现内存空间的良性循环,performance提供多种监控方式监控内存 分析内存相关信息 当代码出现问题的时候及时定位到出现问题的代码块, 提高执行效率. preforcemanc ...

  7. centos7虚拟机开启端口后 外部不能访问的问题

    转载 https://blog.csdn.net/u012045045/article/details/104219823 虚拟机新开了5005端口,系统内部是显示开了的(wget 192.168.4 ...

  8. [Usaco2009 Feb]Bullcow 牡牛和牝牛

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=3398 容易想到的一种\(dp\)就是:设\(dp[i][j]\)表示前\(i\)头牛里面有 ...

  9. 微信小程序代码上传,审核发布小程序

    1.打开微信开发者工具 管理员扫码 -> 填写好小程序的项目目录.AppID(必须是客户已注册好的AppID).项目名称 2.在app.js中修改id(客户登录后台管理系统的id),app.js ...

  10. Scrapy———反爬蟲的一些基本應對方法

    1. IP地址驗證 背景:有些網站會使用IP地址驗證進行反爬蟲處理,檢查客戶端的IP地址,若同一個IP地址頻繁訪問,則會判斷該客戶端是爬蟲程序. 解決方案: 1. 讓Scrapy不斷隨機更換代理服務器 ...