接触docker差不多一个半月,下面是对一路docker学习的总结。本文重在总结知识点,但每个点的不会讲的太细。
1. docker是什么?
Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。假设你写的某个代码依赖了很多三方库,甚至mysql等多个数据库,那么通过docker可以快速的把代码部署到目标机器而节省了环境搭建的环节。
2. linux下安装docker
wget https://get.docker.com -O docker.sh
sudo bash docker.sh
# 推荐设置添加镜像源,否则可能出现docker pull时失败的情况。
echo "DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"" | sudo tee -a /etc/default/docker
这是官网推荐的安装脚本,会自动安装docker-ce的最新稳定版本。支持常见的很多发行版,比如centos7,fedora,debian,ubuntu等。详情看docker.sh那个脚本。
3. Dockerfile
ddocker build配合Dockerfile生成镜像,生成的镜像可以用于发布到网上传播,比如hub.docker.com
中就有很多编译好的docker镜像。下面展示最简单的hello world的镜像如何生成,注意一点后面docker build时会尝试将当前文件夹下所有内容发送到docker服务作为上下文,所以建议单独新建一个文件夹,并在其中新建一个文件名为Dockerfile
,填入以下内容:
# 下面内容会基于bionic版本的ubuntu作为基础镜像
FROM ubuntu:bionic
MAINTAINER spring
# 每个docker镜像需要一个入口点,也就是运行时运行的程序
ENTRYPOINT ["/bin/echo", "Hello world"]
后面通过docker build
编译,通过docker run
运行:
[root@centos hello]# sudo docker build -t hello .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu:bionic
---> ea4c82dcd15a
Step 2/3 : MAINTAINER spring
---> Running in dc34172ee1bb
Removing intermediate container dc34172ee1bb
---> 1898011b7a45
Step 3/3 : ENTRYPOINT ["/bin/echo", "Hello world"]
---> Running in 52c83794a370
Removing intermediate container 52c83794a370
---> 33c4e1f5d398
Successfully built 33c4e1f5d398
Successfully tagged hello:latest
[root@centos hello]# sudo docker run hello
Hello world
但是事实上Dockerfile能定义的东西有很多,比如当我使用mysql镜像时,我需要传入宿主机的某个文件夹做用于存放数据库真实数据,此时需要VOLUME指令。同时mysql是需要供别的服务使用的,此时就需要EXPOSE开放指定端口。下面的Dockerfile是我项目中实际在使用的(不要尝试编译这份配置,只是做个示范):
FROM ubuntu:bionic
MAINTAINER spring
USER 0
COPY libcrypto.so.1.1 /usr/local/lib/
COPY config.json /app/
COPY server /app/
RUN ldconfig
VOLUME ["/mnt/data","/data"]
EXPOSE 80
WORKDIR "/app"
ENTRYPOINT ["/app/server"]
4. docker镜像与docker容器
docker镜像的获得有多种方法:
- 如果公司内部有docker仓库,则使用docker login登陆,并使用docker pull获取镜像。
- docker官方提供一个公共仓库: hub.docker.com,在这个网站找到想要的镜像后不需要login可以直接pull。
- 使用docker build构建属于自己的镜像。
docker images
命令可以查看本地已有的docker镜像。这里image概念如同OOP中的class,当需要使用某个镜像时需要将类实例化,也就是这里的docker create命令,就得到了container(容器)。针对docker 容器常见的操作有docker start
,docker stop
,docker rm
等。但在很多情况下,使用docker create
之后都希望立即启动它,所以就有了docker run
,它相当于docker create
和docker start
的合并。
5. docker-compose服务编排
docker-compose的出现只怪上面的docker命令太难搞了,特别对于有对于多个服务要一起启动时就更崩溃了。但是在我实践过程中发现,除了hello world这种不用带任何参数的docker可以一行一行敲以外,其他容器都会有文件夹映射,端口映射等很多其他参数,在这种情况下你使用docker run
就想直接找块豆腐撞死。
docker-compose的安装:
url="https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)"
sudo wget "$url" -O /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
示范一个项目中正在使用的docker-compose.yml配置文件:
version: "3"
services:
evidence:
container_name: server
image: "xxxxxx:1.0"
volumes:
- /data:/data:rw
ports:
- "80:80"
environment:
- TOKEN_URL=http://192.168.1.2
- DATA_DIR=/data
restart: always
总的概念上讲与上面的Dockerfile类似,只是换了一下语法,后续就可以通过docker-compose up -d
启动服务并放置于后台运行,通过docker-compose down
停止这些服务。当然docker-compose的功能远远不止如此,项目中常用的还有depends_on控制关联服务器的启动,使用networks将各个服务置于一个网段,也可以给每个容器配置静态ip地址等等。
6.知识点总结
1.linux中docker的安装(务必不要使用snap版本的docker,有深坑!!!!)
2.使用Dockerfile编译自己的docker镜像
3.docker基本概念:仓库,镜像,容器。docker常用命令: create,start,stop,rm,rmi,run,logs,inspect等等。
4.使用docker-compose部署docker服务。尽量使用environment传递参数,不要使用config文件再映射到容器的做法。
2019年1月23日更新(docker镜像中文乱码):
- 以debian:9这个docker镜像为例,默认情况下无法输入中文而且显示中文乱码,此时在构建镜像时需要在Dockerfile里面添加:
ENV LANG C.UTF-8
,即可解决中文乱码问题。