# docker快速入门指南

关键词:docker仓库,docker镜像,docker容器,Dockerfile, 基础镜像alpine,工具类镜像busybox, docker宿主机,标签tag

  • docker仓库:存放docker镜像的地方,和maven仓库类似。
  • docker镜像:可以理解成操作系统的安装文件,类似你下载的windows安装文件。
  • docker容器:可以理解成安装好的操作系统并在此操作系统上安装好各种软件。
  • Dockerfile:默认的docker镜像编排文件,通俗讲就是用这个文件创建自己想要的镜像。
  • 标签tag:和github的标签一样,区别不同版本,一般都会有个默认的latest版本,

# 一.注册官方账号

docker官网 (opens new window)

# 二. 环境的搭建-软件安装

# Download Desktop docker for Windows

dockerForWindows (opens new window)

# Download Docker Engine for Linux

#一键安装
curl -sSL https://get.docker.com/ | sh

# 三.码农的源头:hello-world镜像

#拉取hello-world镜像到本地并运行一个匿名容器
docker run hello-world

# 四. 常用命令

#登录docker仓库(使用交互式登录,根据提示输入账号密码即可)
docker login
#拉取ubuntu镜像
docker pull ubuntu:latest
#创建并运行容器 --name表示容器名,-it:表示交到式运行,也就是运行后执行镜像后的shell脚本,退出就停止了。-id:表示在后台运行,常用
docker run -name ubuntu -it ubuntu:latest /bin/bash
docker run -name ubuntu -id ubuntu:latest /bin/bash
#查看本地的镜像,此命令会看到刚才拉取的镜像
docker images #或docker image ls
#查看所有容器
docker ps -a
#查看正在运行的容器
docker ps
#停止容器
docker stop <容器名或id>
#启动容器
docker start <容器名或id>
#重启容器
docker restart <容器名或id>
#删除容器
docker rm <容器名或id>
#删除镜像
docker rmi <容器名或id>

# 五.入门级实践-创建工具类容器

#1.拉取、创建并启动一个ubuntu系统的容器
docker run --name ubuntu-test -id ubuntu
#进入ubuntu系统学习,玩
docker exec -it ubuntu-test /bin/bash
#已经进入了容器内部,可以随便玩了,想装啥就装啥
#玩完之后用exit退出容器
exit

#弄个nginx玩
#准备工作(复制一些文件出来,以免挂载后看不到)
docker run --rm --name nginx-test -id nginx
cd /home/learn/nginx
docker cp nginx-test:/etc/nginx/nginx.conf ./
docker cp nginx-test:/etc/nginx/conf.d ./
#
docker run --name nginx-test -id -p 30080:80 -v /home/learn/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/learn/nginx/conf.d:/etc/nginx/conf.d nginx
#-p 30080:80 表示宿主机的30080端口指向容器内的80端口
#-v 宿主机:容器 表示宿主机的文件或文件夹映射到容器内对应的路径(宿主机的文件要存在)
#访问http://宿主机的ip:30080即可访问nginx了

#弄个tomcat玩玩
docker run --name tomcat-test -id -p 30081:8080 tomcat

#接下来配置nginx可以访问tomcat(通过宿主机的端口访问)
#编辑nginx的配置指向30081端口即可
location /tomcat/ {
        proxy_redirect off ;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto  $scheme;
        proxy_pass   http://192.168.100.205:30081/;
    }
#通过nginx访问tomcat的路径是(http://192.168.100.205:30080/tomcat):宿主机30080->nginx容器80端口->宿主机30081端口->tomcat容器8080端口

# 六. 入门级实践-容器互访

容器互访方式:

  • 借助宿主机端口互访,即通过把容器内提供服务的端口映射到宿主机的端口,然后在其它容器内通过宿主机的IP+服务端口访问。
  • 通过docker网络创建虚拟网络,然后把容器绑定到些网络中,即可通过容器名+服务端口进行互访。
#nginx除了通过端口访问tomcat,但是如果tomcat没有映射端口,则需要怎样做才有访问
#创建docker网络
docker network create my-net
#查看已有的网络
docker network ls
#创建nginx并绑定到明确的网络
docker run --name nginx-test -id -p 30080:80 --network my-net  -v /home/learn/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/learn/nginx/conf.d:/etc/nginx/conf.d nginx

#tomcat
docker run --name tomcat-test -id --net my-net tomcat

#通过访问nginx访问tomcat,减少宿主机端口的占用,更安全
#通过nginx访问tomcat的路径是(http://192.168.100.205:30080/tomcat):宿主机30080->nginx容器80端口->tomcat容器8080端口

# 七. 构建个性化的镜像

docker是用Dockerfile来编写自己的镜像

构建步骤:

  • 指定基础镜像(FROM ),必须
  • 安装必须软件扩展基础镜像功能(RUN ),可选
  • 设置容器工作用户、工作目录(USER [:],WORKDIR )可选
  • 设置容器环境、常量、标签等键值对(ENV,ARG,LABEL),可选
  • 添加文件或文件夹(ADD 和COPY ),可选
  • 容器启动后的运行脚本(CMD或ENTRYPOINT)
  • 声明暴露的端口(EXPOSE <port1[...]> )
# 以下是一份完全的Dockerfile文件,nc服务器
#设置镜像使用的基础镜像
FROM ubuntu:latest
#设置镜像的作者,可选
LABEL MAINTAINER="soul.lau0328@gmail.com 刘默远"
RUN apt update \
	&& apt install -y ncat \
	&& rm -rf var/lib/apt/lists/* \
	&& rm -rf /var/cache/apt

ENTRYPOINT ["nc","-lk","-p","9999"]
EXPOSE 9999
#以下是一份tomcat的容器
FROM tomcat:9.0-jre8-slim

LABEL MAINTAINER=Mofar

COPY ./*.war /usr/local/tomcat/webapps/

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out

EXPOSE 8080
#java工程
# 基础镜像使用java
FROM openjdk:8
# 作者
MAINTAINER Mofar 
# VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
#VOLUME /tmp
#设置时区
ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 将jar包添加到容器中并更名为frontend.jar
ADD ./*.jar /usr/local/lib/frontend.jar

# 执行java -jar xxxx.jar命令,此方法只要命令窗口关闭,程序运行便结束,所以使用管道来实现运行:nohup XXXX &
ENTRYPOINT nohup java -jar -Dserver.port=8080 /usr/local/lib/frontend.jar > /usr/local/logs/catalina.out 2>&1

EXPOSE 8080

#前端工程
FROM nginx:latest

ADD ./*.tar /usr/share/nginx/html/

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

EXPOSE 80

  • Dockerfile相似命令的说明
    • ADD与COPY
      • ADD功用比COPY强大,但是推荐用COPY,ADD复制的文件可以是远程文件,tar类型的源文件会自动解压(gzip,bzip2,xz等)
      • COPY只能复制本地路径的文件和文件夹
    • CMD和ENTRYPOINT
      • CMD命令可以被覆盖,一般用于传变参,存在多条时只有最后一条生效
      • ENTRYPOINT命令内容一般不可覆盖(除非用--entrypoint选项指定),一般用于固定命令和定参等,存在多条时只有最后一条生效
      • 都支持 shell命令格式和字符串数组格式。