特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为MB | 一般为GB |
启动 | 秒级 | 分钟级 |
- 一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
- 镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的只读的文件包。
- 容器,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
stable
test
和 nightly
三个更新频道。cat /etc/redhat-release
uname -a
或者
uname -sr
[root@kongyue ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@kongyue ~]# uname -a
Linux kongyue 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@kongyue ~]# uname -sr
Linux 3.10.0-1160.el7.x86_64
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入docker安装命令:
yum install -y docker-ce
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
docker -v
[root@kongyue ~]# docker -v
Docker version 23.0.1, build a5ee5b1
daemon
配置文件/etc/docker/daemon.json
来使用加速器sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1fb07lig.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker pull nginx
,拉取需要的镜像[不指定tag,默认拉取最新的]docker xx --help
命令查看docker save
和docker load
的语法
docker save --help
docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest
docker rmi nginx:latest
docker load -i nginx.tar
docker pull redis
docker save -o redis.tar redis:latest
docker rmi redis:latest
docker load -i redis.tar
docker run --name containerName -p 80:80 -d nginx
- 默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx
需求:进入Nginx
容器,修改HTML
文件内容
提示:进入容器要用到docker exec
命令。
步骤:
docker exec -it mn bash
命令解读:
sed -i -e 's#Welcome to nginx#nginx欢迎您#g' -e 's###g' index.html
root@b7742dad8446:/usr/share/nginx/html# exit
exit
docker stop mn
[root@kongyue ~]# docker stop mn
mn
docker ps -a
[root@kongyue ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7742dad8446 nginx "/docker-entrypoint.…" 9 minutes ago Exited (0) About a minute ago mn
docker rm -f mn
docker rm -f mn
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
docker exec -it mr bash
redis-cli
set num=666
exit
/var/lib/docker/volumes/html
目录,就等于操作容器内的/usr/share/nginx/html
目录docker volume [COMMAND]
docker volume
命令是数据卷操作,根据命令后跟随的command
来确定下一步的操作:
create
: 创建一个volume
inspect
:显示一个或多个volume
的信息ls
:列出所有的volume
prune
: 删除未使用的volume
rm
: 删除一个或多个指定的volume
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
docker volume create html
docker volume ls
# 查看html数据卷的位置
docker volume inspect html
/var/lib/docker/volumes/html/_data
目录。docker run \
--name mn \
-v html:/root/html \
-p 8080:80 \
nginx
-v html:/root/htm
:把html
数据卷挂载到容器内的/root/html
这个目录中需求:创建一个nginx容器,修改容器内的html目录内的index.html内容
提示:运行容器时使用 -v 参数挂载数据卷
分析:我们进入nginx
容器内部,已经知道nginx
的html目录所在位置/usr/share/nginx/html
,我们需要把这个目录挂载到html
这个数据卷上,方便操作其中的内容。
步骤:
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
需求:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
实现思路如下:
docker load -i mysql.tar
mkdir -p mysql/data
mkdir -p mysql/conf
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=yqk.20021027 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
docker run的命令中通过 -v 参数挂载文件或目录到容器中:
数据卷挂载与目录直接挂载的
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENVkeyvalue |
COPY | 烤贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm/tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java-jarxx.jar |
需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目
docker build -t javaweb:1.0 .
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t javaweb:1.0 .
docker run --name web -p 8090:8090 -d javaweb:1.0
docker-demo2
,然后在目录中新建一个文件,命名为Dockerfile
[root@kongyue tmp]# mkdir docker-demo2
[root@kongyue tmp]# cd docker-demo2/
[root@kongyue docker-demo2]# vim Dockerfile
docker-demo.jar
到这个目录中ENTRYPOINT
,内容如下:FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
docker build -t javaweb:2.0
docker run --name web2 -p 8090:8090 -d javaweb:2.0
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
上面的Compose文件就描述一个项目,其中包含两个容器:
mysql:5.7.25
镜像构建的容器,并且挂载了两个目录docker build
临时构建的镜像容器,映射端口时8090DockerCompose的详细语法参考官网
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改权限
chmod +x /usr/local/bin/docker-compose
/etc/bash_completion.d/docker-compose
docker ps
docker exec -it mysql bash
mysql -uroot -p
SET PASSWORD FOR 'root' = PASSWORD('密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('密码');
[root@kongyue cloud-demo]# docker-compose up -d
cloud-demo
文件夹,里面已经编写好了docker-compose
文件cloud-demo
项目,将数据库、nacos
地址都命名为docker-compose
中的服务名maven
打包工具,将项目中的每个微服务都打包为app.jar
app.jar
拷贝到cloud-demo
中的每一个对应的子目录中cloud-demo
上传至虚拟机,利用 docker-compose up -d
来部署version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
nacos
:作为注册中心和配置中心
image: nacos/nacos-server
: 基于nacos/nacos-server镜像构建environment
:环境变量
MODE: standalone
:单点模式启动ports
:端口映射,这里暴露了8848端口mysql
:数据库
image: mysql:5.7.25
:镜像版本是mysql:5.7.25environment
:环境变量
MYSQL_ROOT_PASSWORD: 123
:设置数据库root账户的密码为123volumes
:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据userservice
、orderservice
、gateway
:都是基于Dockerfile临时构建的docker-compose logs -f
查看日志docker-compose restart gateway userservice orderservice
[root@kongyue cloud-demo]# docker-compose restart gateway userservice orderservice
Restarting cloud-demo_userservice_1 ... done
Restarting cloud-demo_orderservice_1 ... done
Restarting cloud-demo_gateway_1 ... done
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://xxx.xxx.xxx.xxx:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
tmp
目录下新建一个单独的文件夹,进行管理[root@kongyue cloud-demo]# cd /tmp
[root@kongyue tmp]# mkdir registry-ui
[root@kongyue tmp]# cd registry-ui/
[root@kongyue registry-ui]# l
bash: l: 未找到命令...
[root@kongyue registry-ui]# ll
总用量 0
[root@kongyue registry-ui]# touch docker-compose.yml
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
docker-compose.yml
文件,将DockerCompose部署的命令即可!vim docker-compose.yml
docker-compose up -d
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
docker push 192.168.150.101:8080/nginx:1.0
docker pull 192.168.150.101:8080/nginx:1.0
[root@kongyue registry-ui]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cloud-demo_gateway latest ed0df1f6f4cc About an hour ago 185MB
cloud-demo_orderservice latest c2bdb7a31f06 About an hour ago 187MB
cloud-demo_userservice latest 9e834e569449 About an hour ago 184MB
javaweb 2.0 7536a9fd0f4b 5 hours ago 171MB
javaweb 1.0 cc1ebd14e316 5 hours ago 722MB
nginx latest 605c77e624dd 14 months ago 141MB
redis latest 7614ae9453d1 15 months ago 113MB
registry latest b8604a3fe854 16 months ago 26.2MB
nacos/nacos-server latest bdf60dc2ada3 19 months ago 1.05GB
joxit/docker-registry-ui static c97caf4d3877 23 months ago 24.5MB
mysql 5.7.25 98455b9624a9 3 years ago 372MB
[root@kongyue registry-ui]# docker tag nginx:latest 192.168.188.111:8080/nginx:1.0
[root@kongyue registry-ui]# docker push 192.168.188.111:8080/nginx:1.0
The push refers to repository [192.168.188.111:8080/nginx]
d874fd2bc83b: Pushed
32ce5f6a5106: Pushed
f1db227348d0: Pushed
b8d6e692a25e: Pushed
e379e8aedd4d: Pushed
2edcec3590a4: Pushed
1.0: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
[root@kongyue registry-ui]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cloud-demo_gateway latest ed0df1f6f4cc About an hour ago 185MB
cloud-demo_orderservice latest c2bdb7a31f06 About an hour ago 187MB
cloud-demo_userservice latest 9e834e569449 About an hour ago 184MB
javaweb 2.0 7536a9fd0f4b 5 hours ago 171MB
javaweb 1.0 cc1ebd14e316 5 hours ago 722MB
192.168.188.111:8080/nginx 1.0 605c77e624dd 14 months ago 141MB
nginx latest 605c77e624dd 14 months ago 141MB
redis latest 7614ae9453d1 15 months ago 113MB
registry latest b8604a3fe854 16 months ago 26.2MB
nacos/nacos-server latest bdf60dc2ada3 19 months ago 1.05GB
joxit/docker-registry-ui static c97caf4d3877 23 months ago 24.5MB
mysql 5.7.25 98455b9624a9 3 years ago 372MB
[root@kongyue registry-ui]# docker rmi 192.168.188.111:8080/nginx:1.0
Untagged: 192.168.188.111:8080/nginx:1.0
Untagged: 192.168.188.111:8080/nginx@sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
[root@kongyue registry-ui]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cloud-demo_gateway latest ed0df1f6f4cc About an hour ago 185MB
cloud-demo_orderservice latest c2bdb7a31f06 About an hour ago 187MB
cloud-demo_userservice latest 9e834e569449 About an hour ago 184MB
javaweb 2.0 7536a9fd0f4b 5 hours ago 171MB
javaweb 1.0 cc1ebd14e316 5 hours ago 722MB
nginx latest 605c77e624dd 14 months ago 141MB
redis latest 7614ae9453d1 15 months ago 113MB
registry latest b8604a3fe854 16 months ago 26.2MB
nacos/nacos-server latest bdf60dc2ada3 19 months ago 1.05GB
joxit/docker-registry-ui static c97caf4d3877 23 months ago 24.5MB
mysql 5.7.25 98455b9624a9 3 years ago 372MB
[root@kongyue registry-ui]# docker pull 192.168.188.111:8080/nginx:1.0
1.0: Pulling from nginx
Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
Status: Downloaded newer image for 192.168.188.111:8080/nginx:1.0
192.168.188.111:8080/nginx:1.0
[root@kongyue registry-ui]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cloud-demo_gateway latest ed0df1f6f4cc About an hour ago 185MB
cloud-demo_orderservice latest c2bdb7a31f06 About an hour ago 187MB
cloud-demo_userservice latest 9e834e569449 About an hour ago 184MB
javaweb 2.0 7536a9fd0f4b 5 hours ago 171MB
javaweb 1.0 cc1ebd14e316 5 hours ago 722MB
192.168.188.111:8080/nginx 1.0 605c77e624dd 14 months ago 141MB
nginx latest 605c77e624dd 14 months ago 141MB
redis latest 7614ae9453d1 15 months ago 113MB
registry latest b8604a3fe854 16 months ago 26.2MB
nacos/nacos-server latest bdf60dc2ada3 19 months ago 1.05GB
joxit/docker-registry-ui static c97caf4d3877 23 months ago 24.5MB
mysql 5.7.25 98455b9624a9 3 years ago 372MB