安装Docker
学习一门新的技术,最好的办法就是通过官方文档学习 Docker安装官方文档
首先通过Xshell连接远程服务器,就可以再上面展开操作了
安装步骤
- 移除服务器上原有的Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 需要的安装包
yum install -y yum-utils
- 设置镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #这里官方给的地址是外网地址,不建议使用
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #建议使用阿里云镜像仓库
- 更新yum软件包索引
yum makecache fast
- 安装docker相关引擎,docker-ce社区版,docker-ce-cli企业版
yum install docker-ce docker-ce-cli containerd.io
- 启动docker,一路y下去即可
systemctl start docker
- 测试一下hello-world语句
执行这个语句首先会查找有没有镜像,当然我们是第一次部署服务器不存在镜像,然后他会去之前设置的镜像仓库中拉去镜像,和git非常相像
docker run hello-world
其他命令
- 查看已安装的镜像
docker images
- 卸载docker
# 卸载docker引擎等,但不会卸载镜像、容器...
yum remove docker-ce docker-ce-cli containerd.io
# 卸载相关配置文件,如镜像、容器
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
阿里云镜像加速器
配置阿里云镜像加速器,可以使得下载容器速度更快
访问以下链接获取阿里云镜像加速器 点击跳转
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://katcbw02.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
dockers常用命令
帮助命令
docker version # 显示docker版本信息
docker info # 显示docker的系统信息,包括容器和镜像的数量
docker 命令 --help # 显示指定命令的用法
更多帮助命令可以访问官网 docker帮助命令
镜像命令
docker images:查找本地主机上所有已安装的镜像
[root@izbp1bc82otjd8cslsu9zsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
# REPOSITORY 镜像名称
# TAG 镜像版本 latest为最新版本
# IMAGE ID 镜像ID
# CREATED 创建时间
# SIZE 镜像大小
# 可选项
docker images -a # 获取所有镜像
docker images -q # 显示所有镜像的ID
docker search:搜索镜像
[root@izbp1bc82otjd8cslsu9zsz ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11788 [OK]
mariadb MariaDB Server is a high performing open sou… 4487
docker pull:下载镜像
还是拿mysql举例
[root@izbp1bc82otjd8cslsu9zsz ~]# docker pull mysql
Using default tag: latest # 下载最新版本的mysql,默认是latest
latest: Pulling from library/mysql
ffbb094f4f9e: Pull complete # 分层下载
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
8a57a7529e8d: Pull complete
b1ccc6ed6fc7: Pull complete
b4af75e64169: Pull complete
3aed6a9cd681: Pull complete
23390142f76f: Pull complete
Digest: sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727 # 签名
Status: Downloaded newer image for mysql:latest
/library/mysql:latest # 真实地址
# 也可以使用指定版本号的方式下载 docker pull mysql:版本号
[root@izbp1bc82otjd8cslsu9zsz ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
ffbb094f4f9e: Already exists # 这里可以看到分层下载的好处,最新版本的mysql和5.7版本的mysql有相同文件就不需要重复下载两边,极大的节省了空间
df186527fc46: Already exists
fa362a6aa7bd: Already exists
5af7cb1a200e: Already exists
949da226cc6d: Already exists
bce007079ee9: Already exists
eab9f076e5a3: Already exists
c7b24c3f27af: Pull complete
6fc26ff6705a: Pull complete
bec5cdb5e7f7: Pull complete
6c1cb25f7525: Pull complete
Digest: sha256:d1cc87a3bd5dc07defc837bc9084f748a130606ff41923f46dec1986e0dc828d
Status: Downloaded newer image for mysql:5.7
/library/mysql:5.7
docker rmi:删除镜像
docker rmi -f 镜像ID # 删除指定id的镜像
docker rmi -f 镜像ID 镜像ID 镜像ID # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除所有镜像
[root@izbp1bc82otjd8cslsu9zsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 738e7101490b 3 days ago 448MB
mysql latest bbf6571db497 3 days ago 516MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
[root@izbp1bc82otjd8cslsu9zsz ~]# docker rmi -f 738e7101490b
Untagged: mysql:5.7
Untagged: mysql@sha256:d1cc87a3bd5dc07defc837bc9084f748a130606ff41923f46dec1986e0dc828d
Deleted: sha256:738e7101490b45decf606211a5437ed87aa6a82f1ff03c354564bf9375ce20f9
Deleted: sha256:addad8cfeac97b96eb6652a576269346ac96def9a6709ed2388e24fff4345837
Deleted: sha256:e288c3439a7e2f423f50bf22979a759371c51a70bbbaa450993c336978460b1a
Deleted: sha256:33ece15accaa3bb20e3dee84e2e4501469b917c3abba3d5475cd1fec8bb3e82c
Deleted: sha256:6b15390bceeca8424d82e75f5c9aca5eb4693f96849d6382168a99747877693d
[root@izbp1bc82otjd8cslsu9zsz ~]# docker rmi -f $(docker images -aq)
Untagged: mysql:latest
Untagged: mysql@sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Deleted: sha256:bbf6571db4977fe13c3f4e6289c1409fc6f98c2899eabad39bfe07cad8f64f67
Deleted: sha256:a72da99dce60d6f8d4c4cffa4173153c990537fcdfaa27c35324c3348d55dd5c
Deleted: sha256:8b535d432ef2fbd45d93958347b2587c5cbe334f07d6909ad9d2d480ebbafb65
Deleted: sha256:14d13a3b33fc76839f156cd24b4636dab121e6d3d026cefa2985a4b89e9d4df8
Deleted: sha256:77c21a5a897a1ba752f3d742d6c94ee7c6b0e373fd0aeecc4bf88b9a3982007e
Deleted: sha256:189162becec8bb4588c54fb4ea7e62d20121812e68aeb0291fb4bb5df9ec0985
Deleted: sha256:34980dadfd6a5bb9d7f9e8d4e408000e0a8f4840cc7d3092dc94357ebe7a89b6
Deleted: sha256:15b2beb64a91785c8f3709ecd2410d13577b3174faad164524434ce6a7633506
Deleted: sha256:e38dd14d47b61171927ea4b928f7296123b65a81ad1cfde8f5d00cadf1e81bbb
Deleted: sha256:865abdfd8444741f581ce582e4ac5746c4a00c282febf65aa808a235ec7abf78
Deleted: sha256:b1e35233e1ac953bd06fc8fa83afb3a88c39c1aeae0c89a46cb1b652d6821b38
Deleted: sha256:3bcfdf6641227ff63e3ddf9e38e45cf317b178a50a664e45c6ae596107d5bc46
Deleted: sha256:f11bbd657c82c45cc25b0533ce72f193880b630352cc763ed0c045c808ff9ae1
Untagged: hello-world:latest
Untagged: hello-world@sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
容器命令
有了镜像我们才可以创建容器,如何理解容器和镜像的关系呢?
小黄个人是这么理解的:举个比较形象的例子,在电脑中,我们需要运行IDEA,第一步是需要安装IDEA,那么这个IDEA我们可以将他看成一个镜像,安装完IDEA之后,才可以运行IDEA,运行IDEA这个过程我们可以将他看为一个容器,一台电脑中当然可以运行多个IDEA,所以我们的服务器上也可以运行多个容器
新建容器并启动
docker run [可选项] image
# 可选项说明
--name="Name" # 为容器起一个别名
-d # 后台方式运行
-it # 使用交互方式运行,进入容器可查看内容
-p(小写) # 指定容器的端口 如: -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P(大写) # 随机指定容器的端口
# 测试 运行并进入容器(可以看到root@后面的id有所变化) # docker run -it centos /bin/bash
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -it centos /bin/bash
[root@92bfbca98f27 /]# ls # 查看容器内的centos,很多命令是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 退出容器
[root@92bfbca98f27 /]# exit
exit
列出所有运行的容器
docker ps
# 可选项
空 # 列出当前正在运行的容器
-a # 列出当前正在运行的容器以及历史运行过的容器
-n=? # 显示最近创建的容器 ?为整数
-q # 只显示容器编号
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92bfbca98f27 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago recursing_sammet
cfebeadfa0fc centos "/bin/bash" 5 minutes ago Exited (127) 4 minutes ago cool_cartwright
0d7cee725bfc feb5d9fea6a5 "/hello" 25 hours ago Exited (0) 25 hours ago affectionate_blackburn
6116f9e0474a feb5d9fea6a5 "/hello" 2 days ago Exited (0) 2 days ago determined_bohr
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92bfbca98f27 centos "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago recursing_sammet
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps -n=2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92bfbca98f27 centos "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago recursing_sammet
cfebeadfa0fc centos "/bin/bash" 7 minutes ago Exited (127) 7 minutes ago cool_cartwright
退出容器
exit # 退出并且关闭容器
Ctrl + P + Q # 退出容器但不关闭容器 注意必须在开启大写的情况下有效
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -it centos /bin/bash
[root@1e14ac439898 /]# [root@izbp1bc82otjd8cslsu9zsz ~]# docker ps -a
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e14ac439898 centos "/bin/bash" 48 seconds ago Up 47 seconds nostalgic_lumiere
删除容器
docker rm 容器ID # 删除指定容器,当这个容器正在运行时,无法删除
docker rm -f 容器ID # 强制删除指定容器,无论是否在运行
docker rm -f $(docker ps -aq) # 删除所有容器
[root@izbp1bc82otjd8cslsu9zsz ~]# docker rm 1e14ac439898
Error response from daemon: You cannot remove a running container 1e14ac4398982f19e187fa0deeff8fb765f96230c3640be11bd05fffc3a93a83. Stop the container before attempting removal or force remove
启动和停止容器
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止当前正在运行的容器
docker kill 容器ID # 强制停止当前容器
[root@izbp1bc82otjd8cslsu9zsz ~]# docker start cfebeadfa0fc
cfebeadfa0fc
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cfebeadfa0fc centos "/bin/bash" 16 minutes ago Up 6 seconds cool_cartwright
[root@izbp1bc82otjd8cslsu9zsz ~]# docker stop cfebeadfa0fc
cfebeadfa0fc
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
其他常用命令
后台启动容器
docker run -d 容器 # 执行之后会判断是否有需要执行的操作,如果没有的话会关闭容器
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -d centos
c3f6165d659ab262cf57cef57b53ba96672586597d603a69eeec081e852071fc
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 为服务器绑定操作,就不会自动关闭
[root@izbp1bc82otjd8cslsu9zsz ~]# docker run -d centos /bin/sh -c "while true;do echo yellowstar;sleep 1;done;"
2d83699d124e265fabe44c62ce175a38b9d159f6661e1904710107f05d81ebe9
[root@izbp1bc82otjd8cslsu9zsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d83699d124e centos "/bin/sh -c 'while t…" 6 seconds ago Up 5 seconds fervent_austin
查看容器日志
docker logs [可选项] 容器ID # 先来看一下帮助文档
[root@izbp1bc82otjd8cslsu9zsz ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output # 显示日志信息
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative
(e.g. 42m for 42 minutes)
# --tail number 显示number条日志信息
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps # 显示日志信息带有时间戳
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or
relative (e.g. 42m for 42 minutes)
# 比如我想查看2d83699d124e的最新10条日志信息,执行以下操作就会显示需要的数据,并且接着输出新的日志
docker logs -f -t -tail 10 2d83699d124e
查看容器中正在进行的进程信息
docker top 容器ID
[root@izbp1bc82otjd8cslsu9zsz ~]# docker top 2d83699d124e
UID PID PPID C STIME TTY
root 25299 25255 0 14:15 ?
root 28326 25299 0 14:36 ?
查看容器的元数据
docker inspect 容器ID
进入当前正在运行的容器
# 方式一
# docker exec 容器ID bashshell
[root@izbp1bc82otjd8cslsu9zsz ~]# docker exec -it 2d83699d124e /bin/bash
[root@2d83699d124e /]#
# 方式二
# docker attach 容器ID
[root@izbp1bc82otjd8cslsu9zsz ~]# docker attach 2d83699d124e
yellowstar
yellowstar
yellowstar
# 因为这个容器写了一个死循环,一直打印
# docker exec : 进入容器后,开启一个新的终端,可以在里面操作(常用)
# docker attach : 进入容器正在执行的终端,不会启动新的进程
从容器中拷贝文件到主机
# docker ps 容器ID:被拷贝的文件路径 拷贝到的地址路径
[root@izbp1bc82otjd8cslsu9zsz /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b51bb7e84cf9 centos "/bin/bash" 5 minutes ago Up 5 minutes angry_carver
[root@izbp1bc82otjd8cslsu9zsz /]# docker exec -it b51bb7e84cf9 /bin/bash
[root@b51bb7e84cf9 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr yellowstar.java
[root@b51bb7e84cf9 /]# touch test.java # 创建test.java
[root@b51bb7e84cf9 /]# ls
bin etc lib lost+found mnt proc run srv test.java usr yellowstar.java
dev home lib64 media opt root sbin sys tmp var
[root@b51bb7e84cf9 /]# exit
exit
# 将容器根目录中的test.java文件拷贝到主机中的home路径下
[root@izbp1bc82otjd8cslsu9zsz /]# docker cp b51bb7e84cf9:/test.java /home
[root@izbp1bc82otjd8cslsu9zsz /]# cd /home
[root@izbp1bc82otjd8cslsu9zsz home]# ls
admin staragent test.java www yellowstar.java
docker安装软件
通过以上的学习,我们来安装一些常用软件检测一下学习成果,只有不断地敲代码才能理解,不可以光说不做
安装nginx
先来回顾一下安装软件的步骤
- 在docker hub上搜索软件
- 通过docker pull 下载镜像
- 使用run命令运行
# docker search nginx 搜索软件,个人建议还是去docker hub上搜索,可以看到一些帮助文档
# docker pull nginx 下载镜像
# docker run --name nginx01 -d -p 3344:80 nginx 后台运行nginx,并为他映射外部的端口号为3344
nginx使用的是80端口,而一个容器相当于一个小的linux系统,与外界是独立开来的,所以我们需要将容器中的80端口映射到服务器中的3344端口(可以自己随意取)
除了映射端口之外,我们还需要开放阿里云服务器的防火墙,暴露我们的3344端口才可以被公网访问
我们现在访问121.40.45.37:3344即可访问到nginx的主页
安装tomcat
安装启动跟nginx一样,映射到3355的端口
# docker search tomcat
# docker pull tomcat
# docker run -d -p 3355:8080 --name tomcat01 tomcat
我们尝试访问ip:3355,发现找不到页面
# 进入tomcat的安装目录,我们发现webapps文件夹是空的,所以我们访问不到页面
[root@izbp1bc82otjd8cslsu9zsz ~]# docker exec -it 70a6d4bd78e1 /bin/bash
root@70a6d4bd78e1:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@70a6d4bd78e1:/usr/local/tomcat# cd webapps
root@70a6d4bd78e1:/usr/local/tomcat/webapps# ls
root@70a6d4bd78e1:/usr/local/tomcat/webapps#
# 我们需要将webapps.dist中的文件全部拷贝到webapps中
root@70a6d4bd78e1:/usr/local/tomcat/webapps# cd ..
root@70a6d4bd78e1:/usr/local/tomcat# cp -r webapps.dist/* webapps
这时候我们再来访问页面
安装ES
es小黄还没使用过,本来想着就不写了的,听着狂神老师的视频,也有所了解,具体我就不测试了,把需要注意的地方写出来供大家参考
因为ES非常占用内存,买来测试的服务器要么就是1核2G要么就是2核4G,2g的话基本上被ES就占满了,服务器运行相当的困难,所以我们要通过命令来限制ES使用的内存空间
docker run -d --name elasticsearch01 -p9300:9300 -p9200:9200 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch
# -e ES_JAVA_OPTS="-Xms64m -Xms512m" 通过这行代码,设置es的运行内存最小占用64兆,最大占用512兆
commit镜像
我们在启动tomcat容器的时候,发现webapps包下没有文件,需要从webapps.dist文件中将所有文件拷贝到webapps目录下。
拿楼层来举例,dockers为了节省空间,为我们安装的都是基础包,那么这些基础包都在一楼,而我们要进行如tomcat一样的操作,也就是在上面盖楼,追加一些文件。我们肯定不希望每次重启tomcat的时候都再手动盖一层楼,那么我们可以将这两层楼生成一个镜像,以后启动tomcat只需要run两层楼的即可。
docker commit -a="作者" -m="修改的备注" 容器ID 新的镜像名:[tag]
[root@izbp1bc82otjd8cslsu9zsz ~]# docker commit -a="yellowstar" -m="tomcat add webapps" ef2f4dc60310 mytomcat:1.0
sha256:96874184f6c6cc5678d8267b2898adb3c92fae58d326af005f3639059f2e5ac4
[root@izbp1bc82otjd8cslsu9zsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 96874184f6c6 8 seconds ago 684MB # 可以发现mytomcat相比于tomcat占用的内存稍微大一些
tomcat latest 49842ef82091 4 days ago 680MB # 就是因为我们添加了webapps文件
mysql 8.0.27 bbf6571db497 5 days ago 516MB
nginx latest f652ca386ed1 5 days ago 141MB
centos latest 5d0da3dc9764 2 months ago 231MB