Docker笔记(学习视频:B站遇见狂神说)
Linux准备
1、安装JDK
# 下载JDK的rmp包
jdk-8u311-linux-x64.rpm
# 安装
rpm -ivh jdk-8u311-linux-x64.rpm
# 配置环境变量
# 1、输入命令 vi /etc/profile
# 2、按下 i ,在最后加入以下代码
unset i
unset -f pathmunge
JAVA_HOME=/usr/java/jdk1.8.0_311-amd64 # 这里的jdk1.8.0_311-amd64需要自己去/usr/java目录下确认,不同版本的JDK都不一样
CLASSPATH=%JAVA_HOME%/lib;%JAVA_HOME%/jre/lib
PATH=$JAVA_HOME/bin;$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
2、安装Tomcat
# 下载Tomcat的压缩包(.tar.gz)后缀
# 切换到压缩包所在目录
# 解压
tar zxvf apache-tomcat-9.0.54.tar.gz
# 运行tomcat测试
# 1、进去tomcat的bin文件夹,运行startup.sh
[root@localhost bin]# ls
bootstrap.jar configtest.sh shutdown.sh
catalina.bat daemon.sh startup.bat
catalina.sh digest.bat startup.sh
catalina-tasks.xml digest.sh tomcat-juli.jar
ciphers.bat makebase.bat tomcat-native.tar.gz
ciphers.sh makebase.sh tool-wrapper.bat
commons-daemon.jar setclasspath.bat tool-wrapper.sh
commons-daemon-native.tar.gz setclasspath.sh version.bat
configtest.bat shutdown.bat version.sh
[root@localhost bin]# ./startup.sh # 运行
Using CATALINA_BASE: /download/apache-tomcat-9.0.54
Using CATALINA_HOME: /download/apache-tomcat-9.0.54
Using CATALINA_TMPDIR: /download/apache-tomcat-9.0.54/temp
Using JRE_HOME: /usr
Using CLASSPATH: /download/apache-tomcat-9.0.54/bin/bootstrap.jar:/download/apache-tomcat-9.0.54/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
安装
1、确保Linux系统版本在CentOS7以上
2、yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
3、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、更新yum软件包索引 (可能会出错,直接跳到下一步即可)
yum makecache fast
7、安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
8、测试启动Docker
systemctl start docker
9、测试
#查看版本
docker version
#运行hello world,一开始没有这个镜像,输入命令后会自动下载
docker run hello-world
#查看镜像
docker images
阿里云镜像加速
四个命令依次在Linux控制台输入即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0zg1sztf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker run 镜像名—的工作流程
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行该指令
Docker为什么比虚拟机快?
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm需要是Guest OS
Docker新建一个容器的时候,不需要重新加载系统内核;虚拟机需要加载Guest OS(分钟级别),Docker利用了宿主机的操作系统(秒级),省略了这个复杂的过程
Docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档的地址:Reference documentation | Docker Documentation
镜像命令
docker images 查看所有本地的主机上的镜像
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的id
docker rmi 镜像id 删除指定id的镜像(删之前要先把对应的container删除,因为该镜像可能被container引用
也可以直接使用
docker rmi -f 镜像id
强制删除)
[root@localhost /]# docker rmi feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
docker ps -a 列出所有容器 (要删除hello-world镜像,就要先找出引用hello-world的容器id)
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7657ea7ed321 hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago epic_goldwasser
docker rm 容器id 删除指定id的容器(之后就可以删除hello-world的镜像了)
[root@localhost /]# docker rm 7657ea7ed321
7657ea7ed321
docker search 镜像名 搜索镜像
[root@localhost /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11611 [OK]
mariadb MariaDB Server is a high performing open sou… 4417 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 857 [OK]
#可选项,通过收藏来过滤
--filter=STARS=3000 搜索出来的镜像就是收藏是大于3000的
[root@localhost /]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11611 [OK]
mariadb MariaDB Server is a high performing open sou… 4417 [OK]
docker pull 镜像名 下载镜像(默认下载最新版)
# 下载镜像 docker pull 镜像名[:tag]
[root@localhost /]# docker pull mysql
Using default tag: latest # 如果不写[:tag],默认就是latest
latest: Pulling from library/mysql
b380bbd43752: Pull complete # 分层下载, docker image的核心 联合文件系统
f23cbf2ecc5d: Pull complete
30cfc6c29c0a: Pull complete
b38609286cbe: Pull complete
8211d9e66cd6: Pull complete
2313f9eeca4a: Pull complete
7eb487d00da0: Pull complete
4d7421c8152e: Pull complete
77f3d8811a28: Pull complete
cce755338cba: Pull complete
69b753046b9f: Pull complete
b2e64b0ab53c: Pull complete
Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 以上一条命令等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@localhost /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b380bbd43752: Already exists
f23cbf2ecc5d: Already exists
30cfc6c29c0a: Already exists
b38609286cbe: Already exists
8211d9e66cd6: Already exists
2313f9eeca4a: Already exists
7eb487d00da0: Already exists
a71aacf913e7: Pull complete
393153c555df: Pull complete
06628e2290d7: Pull complete
ff2ab8dac9ac: Pull complete
Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 938b57d64674 13 days ago 448MB
mysql latest ecac195d15af 13 days ago 516MB
容器命令
说明:有了镜像才可以创建容器,linux,下载一个centos镜像测试学习
docker pull centos
[root@localhost /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-p 随机指定端口
# 测试,启动并进入容器
[root@localhost /]# docker run -it centos /bin/bash
[root@c8a8a13ac174 /]# ls # 查看容器内的centos,基础版本,很多命令还不完善
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 退出容器,从容器退出到主机
[root@c8a8a13ac174 /]# exit
exit
列出所有运行的容器
docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 以及 历史运行过的容器
-n=? # 显示最近创建的容器
-aq # 显示所有当前容器的编号
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8a8a13ac174 centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago optimistic_carver
退出容器
exit # 直接停止并退出容器
Ctrl + P + Q # 退出容器但不停止
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,要强制删除需要加 -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
常用其他命令
后台启动容器
# 命令 docker run -d 镜像名
# 问题:docker ps, 发现centos停止了
# 常见的坑:docker容器使用后台运行,就必须有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail 日志条数 容器id
# 自己编写一段shell脚本
[root@localhost /]# docker run -d centos /bin/sh -c "while true; do echo localhost;sleep 1;done"
d2a45bc782a75a22e7da22fa06cf0b33274f449025add419811bfc1c816fa11a
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2a45bc782a7 centos "/bin/sh -c 'while t…" 5 seconds ago Up 3 seconds great_edison
# 显示日志
-f -t 可以结合起来 -tf # 显示日志
--tail number # 要显示的日志条数
[root@localhost /]# docker logs -f -t --tail 10 d2a45bc782a7
2021-11-01T02:42:16.625371264Z localhost
2021-11-01T02:42:17.628116952Z localhost
2021-11-01T02:42:18.633494886Z localhost
2021-11-01T02:42:19.635309795Z localhost
2021-11-01T02:42:20.638327390Z localhost
2021-11-01T02:42:21.641747570Z localhost
2021-11-01T02:42:22.644098419Z localhost
2021-11-01T02:42:23.655560465Z localhost
2021-11-01T02:42:24.659873927Z localhost
2021-11-01T02:42:25.666505490Z localhost
2021-11-01T02:42:26.669244649Z localhost
2021-11-01T02:42:27.674658522Z localhost
2021-11-01T02:42:28.676837277Z localhost
2021-11-01T02:42:29.678706504Z localhost
2021-11-01T02:42:30.681514524Z localhost
2021-11-01T02:42:31.684640413Z localhost
2021-11-01T02:42:32.688320038Z localhost
查看容器中的进程信息ps
top命令
docker top 容器id
[root@localhost /]# docker top d2a45bc782a7
UID PID PPID C STIME TTY TIME CMD
root 46808 46787 0 19:40 ? 00:00:00 /bin/sh -c while true; do echo localhost;sleep 1;done
root 47806 46808 0 19:51 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看镜像的元数据
[root@localhost /]# docker inspect d2a45bc782a7
[
{
"Id": "d2a45bc782a75a22e7da22fa06cf0b33274f449025add419811bfc1c816fa11a",
"Created": "2021-11-01T02:40:13.810286187Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo localhost;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 46808,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-11-01T02:40:15.10685646Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/d2a45bc782a75a22e7da22fa06cf0b33274f449025add419811bfc1c816fa11a/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/d2a45bc782a75a22e7da22fa06cf0b33274f449025add419811bfc1c816fa11a/hostname",
"HostsPath":