点击上方 “码农沉思录” ,选择“设为星标” 优质文章,及时送达
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的端口、网络与容器卷 学习
doker
除了镜像制作之外,还需要理解这三点:端口映射、网络模式、容器卷(
volume
)。
端口映射
将宿主机端口映射到容器的端口,外部通过访问宿主机端口从而访问容器内应用。如容器中redis使用的端口是
6379
,可以将宿主机的
10880
端口与容器的
6379
端口映射,外部通过宿主机
ip
和
10880
端口访问容器中的
redis
。
### 使用镜像运行容器### -p 10880:6379 将宿主机10880端口映射到容器6379端口
[[email protected] redis-app]# docker container run -itd --name simple-redis \
-p 10880:6379 wujiuye/simple-redis:5.0.7
05676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a
### 宿主机访问容器中的redis
[[email protected] 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/目录下。
### 创建容器卷
[[email protected] docker]# docker volume create test-voltest-vol### 查看容器卷信息
[[email protected] 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"
}
]### 将容器卷挂载到容器
[[email protected] 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
# 使用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"]
- 1、
、COPY
命令的ADD
只能使用相对路径,需要将文件拷贝到src
的同级目录下Dockerfile
- 2、不要将
安装包与redis
配置文件redis
或COPY
到容器的挂载目录下,否则因宿主机的源目录下没有这些文件,容器启动起来就找不到这些文件。构建镜像时将文件放在容器的ADD
目录下,而启动容器时配置宿主机目录挂载到容器的/data/apps/
,/data/apps/
会将镜像中原有的docker
目录移除,才可以挂载。/data/apps/
- 3、
运行多条命令可使用RUM
符号连接,也可以写多个&&
RUN
构建镜像
### 目录下的文件
[[email protected] redis-app]# ls
Dockerfile redis-5.0.7.tar.gz redis.conf### 构建镜像
[[email protected] 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
查看容器信息
[[email protected] 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
[r[email protected] 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]
祝大家在2020年工作顺路,家庭幸福,合家团圆