初识Docker
为什么要用Docker
大型项目组件较多,运行环境也很复杂,部署时可能会遇到以下问题:
- 依赖关系复杂,兼容问题频发
- 开发、测试、生产环境有差异
Docker是怎么解决的?
- 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免相互干扰
- Docker镜像中包含完整运行环境,包括系统函数库
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见
DockerHub:DockerHub是一个Docker镜像的托管平台,这样的平台称为Docker Registry
Docker架构
Docker是一个C/S架构的程序,包含两部分:
- 服务端:Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端:通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务端发送指令
Docker安装示例
卸载
如果之前安装过旧版本Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
安装Docker
安装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
输入命令:
yum install -y docker-ce
启动Docker
Docker应用需要用到各种端口,逐一去修改防火墙设置非常麻烦,可以关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
通过命令启动docker
systemctl start docker
systemctl stop docker
systemctl restart docker
Docker基本操作
镜像相关命令
- 镜像名称一般分两部分:[repository]:[tag]
- 在没有指定tag时,默认是latest,代表最新版本的镜像
编写Dockerfile
要创建Docker镜像(image)必须在配置文件中指定步骤。这个文件默认我们通常称之为Dockerfile
,示例代码如下:
FROM golang:alpine
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件app
RUN go build -o app .
# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist
# 将二进制文件从 /build 目录复制到这里
RUN cp /build/app .
# 声明服务端口
EXPOSE 8888
# 启动容器时运行的命令
CMD ["/dist/app"]
From
可以使用基础镜像golang:alpine
来创建镜像。
Env
用来设置我们编译阶段需要用的环境变量。
WORKDIR
移动到工作目录
COPY
将代码复制到容器中
RUN
RUN go build -o 将我们的代码编译成二进制可执行文件app
RUN cp 将二进制文件从一个目录复制到这里
EXPORT
声明服务端口,因为我们的应用程序监听的是这个端口并通过这个端口对外提供服务。
CMD
定义了在我们运行镜像的时候默认执行的命令CMD ["/dist/app"]
构建镜像
在项目目录下,执行下面的命令创建镜像,并指定镜像名称为myImage
:
docker build . -t goweb_app
执行下面的命令运行镜像:
docker run -p 8888:8888 myImage