网站首页 > 技术文章 正文
迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Go语言、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。
docker容器化部署应用可以简化应用的部署流程。假设部署一个应用需要在机器上安装和配置nginx、tomcat,如果需要新增一台服务器,或者切换服务器,那么就要重复同样的操作,安装nginx、tomcat并配置。容器化部署就是一次配置到处使用,将安装nginx配置nginx这一系列工作制作成一个镜像,在服务器上通过docker拉取镜像并启动容器即可,基于此实现集群自动伸缩。
docker入门简单,用好难,特别是制作镜像。随便做一个镜像就是1g大小,这该怎么用。如果每次部署都要拉1g的镜像,想想都可怕。如果在Dockerfile中使用yum安装一些软件,build的时间会很长,加上镜像太大,传输也耗时。应尽量使用安装包安装替换yum安装,以及使用尽量小的基础镜像。
使用Dockerfile构建镜像,我们可以理解为,docker基于Dockerfile中的FROM基础镜像,启动了一个容器,然后在容器中执行Dockerfile中定义的脚本,执行完成后再打包成镜像。
docker的镜像是分层的,你可以先定制一个基础镜像,再通过基础镜像去实现差异化定制。比如部署一个java项目,每台机制都需要jdk,但并不是每台机器都需要安装nginx,那么就可以先制作一个jdk基础镜像。当然,制作jdk基础镜像也是基于更底层的基础镜像,比如centos。然后再基于jdk基础镜像制作nginx镜像,再制作应用镜像。制作应用镜像如果需要用到nginx就可以基于nginx镜像,不需要依赖nginx的就可以直接基于jdk镜像。
docker的命令不需要记,动动手去试一试就记住了,记不住可以使用docker -help查看命令。新版本docker将命令规范了,如docker image是镜像相关的,docker container是容器相关的,同样,也可以使用docker container -help来查看命令帮助。
Docker的端口、网络与容器卷
学习docker除了镜像制作之外,还需要理解这三点:端口映射、网络模式、容器卷(volume)。
端口映射
将宿主机端口映射到容器的端口,外部通过访问宿主机端口从而访问容器内应用。如容器中redis使用的端口是6379,可以将宿主机的10880端口与容器的6379端口映射,外部通过宿主机ip和10880端口访问容器中的redis。
### 使用镜像运行容器
### -p 10880:6379 将宿主机10880端口映射到容器6379端口
[root@wujiuye01 redis-app]# docker container run -itd --name simple-redis \
-p 10880:6379 wujiuye/simple-redis:5.0.7
05676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a
### 宿主机访问容器中的redis
[root@wujiuye01 redis-app]# /root/redis/redis-5.0.5/src/redis-cli -p 10880
127.0.0.1:10880>
网络模式
docker支持5种网络模式,这里不做详细分析,因为我不是很了解。在启动容器时,可以指定使用哪种网络模式:docker container run --network [网络模式]。
- bridge: 默认使用,docket启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
- host: 容器不会获得一个独立的network namespace,而是与宿主机共用一个。
容器卷(volume)
应用部署在一台服务器上运行会产生日记,不能随着容器的删除而导致日记被删除,所以需要将容器中的工作目录与宿主机的目录映射。或者说mysql容器,容器移除而数据库文件不能删除。docker为我们提供了三种不同的方式将容器卷或宿主机目录从宿主机挂载到容器中:volume、bind mount、tmpfs。
volumes
docker管理宿主文件系统的一部分(/var/lib/docker/volumes/容器id)
- 创建容器卷:docker volume create test-vol
- 查看容器卷:docker volume inspect test-vol
- 将容器卷挂载到容器的目录:docker container run -itd --name test --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
--mount src=test-vol,dst=/data/apps/test: 将容器卷挂载到容器的/data/apps/test目录。
将文件放到容器的/data/apps/test目录下,可以在宿主机的/var/lib/docker/volumes/test-vol目录看到,反过来也是一样的。如果不指定--mount,默认也是使用volumes,并且容器卷的名称就是容器id,也是在/var/lib/docker/volume/目录下。
### 创建容器卷
[root@wujiuye01 docker]# docker volume create test-vol
test-vol
### 查看容器卷信息
[root@wujiuye01 docker]# docker volume inspect test-vol
[
{
"CreatedAt": "2020-01-04T17:57:08+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
### 将容器卷挂载到容器
[root@wujiuye01 docker]# docker container run -itd --name test \
--mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
bind mounts
可以存储在宿主机系统的任意目录,宿主机的目录必须存在。如果宿主机新增磁盘是挂载在/data目录的,建议使用这种。如使用aws的ec2实例。
docker container run -itd --name test --mount type=bind,src=宿主机目录,dst=容器目录 wujiuye/test:1.0.0
将指定的宿主机目录挂载到容器的指定目录。将文件放到<容器指定目录>下,可以在<宿主机指定目录>看到,反过来也是一样的。
tmpfs
挂载存储在宿主机系统的内存中,不会写入宿主机的文件系统
Docker的安装与启动
docker安装
# 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 设置稳定的仓库。
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装最新版本的 Docker Engine-Community 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
docker服务启动与停止
## 停止
sudo systemctl stop docker
## 启动
sudo systemctl start docker
Docker使用简单事例
制作一个简单的redis镜像
准备redis安装包和配置文件,新建一个Dockerfile文件,目录结构如下:
-rw-r--r-- 1 root root 583 Jan 4 18:56 Dockerfile
-rw-r--r-- 1 root root 1984203 Jan 4 18:52 redis-5.0.7.tar.gz
-rw-r--r-- 1 root root 61797 Jan 4 18:52 redis.conf
编写Dockerfile文件,基于centos:7镜像
FROM centos:7
MAINTAINER wujiuye <postmaster@wujiuye.com>
# 使用ps 命令 :ps -ef|grep redis
RUN yum install -y procps
# redis安装包和配置文件
ADD redis-5.0.7.tar.gz /usr/local/redis/
COPY redis.conf /usr/local/redis/local-redis.conf
# 安装gcc
RUN yum install gcc -y
# 安装make
RUN yum install make -y
# 编译redis
RUN cd /usr/local/redis/redis-5.0.7 && \
make
RUN yum clean all
EXPOSE 6379
# 启动redis
ENTRYPOINT /usr/local/redis/redis-5.0.7/src/redis-server
CMD ["/usr/local/redis/local-redis.conf"]
构建镜像
### 目录下的文件
[root@wujiuye01 redis-app]# ls
Dockerfile redis-5.0.7.tar.gz redis.conf
### 构建镜像
[root@wujiuye01 redis-app]# docker image build --tag wujiuye/simple-redis:5.0.7 .
....
Successfully built 2aab79854763
Successfully tagged wujiuye/simple-redis:5.0.7
--tag打标签,最后的‘.’是Dockerfile文件所在的位置。
根据镜像启动容器
docker container run \
--rm -itd \
--ulimit nofile=102400:102400 \
--name=simple-redis \
-p 10880:6379 \ # 可写多个
--mount type=bind,src=/data/redis-app/,dst=/usr/local/redis \
wujiuye/simple-redis:5.0.7
- --rm: 如果容器存在则删除,只是移除容器,正在运行的容器不会停止
- --name=simple-redis: 给容器取一个名字
- -itd: -i、-t、-d的结合
- --ulimit nofile=102400:102400 设置ulimit
- -p 10880:6379 宿主机与容器的端口映射
- --mount type=bind,src=...,dst=... 文件系统为bind mount,src为宿主机的目录,dst为容器中的目录
查看容器信息
[root@wujiuye01 redis-app]# docker container ls
### 容器id 使用的镜像 容器执行的命令 创建时间 容器状态 端口信息 容器名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05676da44583 wujiuye/simple-redis:5.0.7 "/bin/sh -c /usr/loc…" 6 minutes ago Up 6 minutes 0.0.0.0:10880->6379/tcp simple-redis
将镜像push到docker hub
在测试完镜像可用之后,可以选择push到远程仓库,也可自己搭建一个镜像仓库。
- 1)、注册hub.docker.com账号,id不要随便填写,如:wujiuye
- 2)、创建一个仓库,如:wujiuye/simple-redis
- 3)、如果需要,将本地的镜像打标签,对应到远程仓库,如:docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7。本地镜像与远程仓库镜像标签不同时使用。
- 4)、docker login 输入用户名密码登陆
- 5)、docker push wujiuye/simple-redis:5.0.7 推送镜像至远程仓库
[root@wujiuye01 redis-app]# docker push wujiuye/simple-redis:5.0.7
The push refers to repository [docker.io/wujiuye/simple-redis]
dafbadcc43aa: Pushing [==> ] 1.281MB/23.62MB
879a0e8874ba: Pushing [=============================> ] 66.96MB/111.8MB
ccc522a455bc: Pushing [> ] 549.9kB/100.2MB
879a0e8874ba: Pushing [================================> ] 73.04MB/111.8MB
ccc522a455bc: Pushing [> ] 1.107MB/100.2MB
ff7b8add839d: Pushing [=================> ] 51.75MB/146.8MB
dca066a10cae: Pushing [> ] 557.1kB/100.8MB
77b174a6a187: Waiting
Other
容器停止
1)、docker kill [容器名]
可选参数:
--signal: 发送信号量
2)、docker stop []
删除容器和镜像
- 1)、删除所有镜像:docker rmi $(docker images -q)
- 2)、删除所有容器:
1)、先停止所有容器:docker stop $(docker ps -a -q)
2)、删除所有容器:docker rm $(docker ps -a -q)
删除某个镜像:
1)、docker image rm [repository,如:wujiuye/simple-redis:5.0.7]
2)、docker image rm [镜像id]
删除某个容器:
docker container rm [容器名称 或 容器id]
来源 Java艺术 | wujiuye
如有侵权请联系删除
猜你喜欢
- 2024-10-14 Docker Overlay 网络学习 dockercompose 网络
- 2024-10-14 盘点c++几种常见的设计模式及具体实现
- 2024-10-14 Docker新手福音!这个开源控制面板让你更快上手Docker
- 2024-10-14 Docker-掌握这三种方法,创建自己的docker镜像
- 2024-10-14 docker 基础概念 docker基于什么
- 2024-10-14 小白也能轻松上手,深度体验绿联私有云DX4600 Docker功能
- 2024-10-14 一文带你了解docker常用命令 docker常用命令及参数
- 2024-10-14 Docker最佳实践的反模式 docker反向代理
- 2024-10-14 docker中容器如何实现通信 docker容器之间如何通信
- 2024-10-14 工程化Docker:确保应用程序的可靠性、可扩展性和可维护性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)