Docker快速入门使用

写到前面
给别人写的看的,顺便发出来,适合没用过快速上手的
有些解释为了说明问题,概念并不是很准确

简单了解下概念

  • image 镜像,就像安装系统的.iso镜像,包含了系统文件/环境(比如运行java的环境)等
  • container 实例,运行一个镜像的实例,就像是new了这个镜像

1. 去安装

Windows/Mac下直接点击这里去下载安装桌面
其他的或者更详细的去看这里: Docker 安装,侧边栏有各种系统的安装

2. 找个centos7的镜像试试

centos7是常见的线上服务器环境,这里运行一个centos7实例

2.1 拉取镜像
默认情况下会去 https://hub.docker.com/ 仓库下拉取,就跟代码仓库、maven仓库类似,怎么修改仓库地址可以去百度
拉取镜像:

docker pull centos:centos7

压缩后的大小只有72.57 MB,应该很快就好了

这时运行docker images,可以看到有centos:centos7的镜像

 ~ docker images
REPOSITORY                              TAG                    IMAGE ID            CREATED             SIZE
centos                                  centos7                7381c3b1d15c        6 weeks ago         204MB

2.2 运行一个容器
运行一个centos7容器,-it是进入命令交互界面,冒号前面的centos是REPOSITORY,后面的centos7是TAG,凭感觉理解下

docker run -it centos:centos7 bash

进入容器内部:
centos7容器内

就跟使用一个linux一样就行了

执行exit命令退出

3. 自己制作一个java镜像

如果没有现成的镜像,如何制作一个自己需要的环境,这里以制作java镜像为例

3.1 编写Dockerfile
Dockerfile中包含了构建镜像的指令
只要简单的先了解三个指令就行:

  • FROM 依赖的基础镜像,相当于直接在依赖的镜像上操作
  • RUN 要执行的命令,先直接使用shell命令就行了,别的格式后面再去百度
  • ENV 设置环境变量

新建一个文件,文件名就叫Dockerfile,也可以叫别的,只不过使用别的名字构建时需要通过-f指定,感兴趣可以查下
Dockerfile文件内容:

# 这里就以上面的centos7为基础镜像
FROM centos:centos7

# 更换yum源,如果你访问默认源的速度很快,也可以注释掉
RUN echo "更换yum源"
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache

# 这里偷下懒,直接yum install 很老的java8
RUN echo "安装java8"
RUN yum install -y java-1.8.0-openjdk*

# 设置JAVA_HOME,这里的路径是个软链
RUN echo "设置JAVA_HOME"
ENV JAVA_HOME=/etc/alternatives/java_sdk_1.8.0

RUN echo "构建完成"

3.2 构建镜像
现在构建一个REPOSITORY为java, TAG为1.8-centos7的镜像
在刚才的Dockerfile文件所在目录执行命令(注意最后的.代表构建上下文为当前目录):

docker build -t java:1.8-centos7 .

构建完成后:
构建成功

3.3 运行看看
进入java容器:

docker run -it java:1.8-centos7 bash

看看环境并随便写个HelloWorld运行下:

[root@5c82e883b72a /]# echo $JAVA_HOME
/etc/alternatives/java_sdk_1.8.0
[root@5c82e883b72a /]# java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
[root@5c82e883b72a /]# mkdir -pv /opt/app && cd /opt/app
mkdir: created directory '/opt/app'
[root@5c82e883b72a app]# cat >> HelloWorld.java << EOF
> public class HelloWorld {
>     public static void main(String[] args) {
>         System.out.println("Hello world");
>     }
> }
> EOF
[root@5c82e883b72a app]# ls
HelloWorld.java
[root@5c82e883b72a app]# javac HelloWorld.java
[root@5c82e883b72a app]# ls
HelloWorld.class  HelloWorld.java
[root@5c82e883b72a app]# java HelloWorld
Hello world
[root@5c82e883b72a app]#

exit退出下

4. 怎么保存容器内文件

上面运行exit退出,再创建容器,发现刚才/opt下的/app目录和HelloWorld.java文件不见了

文件未保存

如果想要文件还在,可以通过-v选项去挂载容器内目录,当然还有其他挂载方式,可以去百度
这里给宿主机当前用户下新建了一个目录: ~/demo/mount_opt
挂载这个目录到容器中的/opt
运行命令,创建一个挂载了目录的容器:

docker run -it -v ~/demo/mount_opt:/opt java:1.8-centos7 bash

尝试容器内创建文件后退出容器,宿主机存在创建的文件
再次进入,容器内仍然有文件

目录挂载

5. 启动容器直接运行自己的程序

这部分需要在宿主机操作

5.1 新建HelloWorld.java文件

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

5.2 新建start.sh文件

#!/bin/bash

cd /opt
javac HelloWorld.java
echo "Run HelloWorld >>>>"
java HelloWorld

5.3 修改Dockerfile,把自己的代码打包进镜像
直接以上面的镜像java:1.8-centos7为基础镜像,使用COPY命令将代码复制到镜像中

# 使用上面的java镜像
FROM java:1.8-centos7

# 文件复制到镜像内/opt目录下,根据自己目录决定
COPY HelloWorld.java /opt/
COPY start.sh /opt/

RUN echo "构建完成"

注意: 这里HelloWorld.java、start.sh、Dockerfile文件在同一目录下,如果不同目录,需要修改Dockerfile

5.4 构建新镜像
Dockerfile文件所在目录下执行:

docker build -t helloworld:java1.8-centos7 .

构建成功后通过docker images可以看到

5.5 启动容器运行我们的start.sh

docker run -it helloworld:java1.8-centos7 bash /opt/start.sh
Java代码输出

可以看到java代码的输出

6. 怎么再开一个运行的容器终端

比如,上面运行的容器,终端提示符root@之后就是容器ID的前8位,也可以通过docker ps命令查看容器ID
这里的容器ID是2e67d474993a
直接在别的终端通过docker exec命令进入就可以了:

docker exec -it 2e67d474993a bash

7. 镜像保存给别人用

通过docker save保存镜像
这里保存后再压缩减少大小:

docker save java:1.8-centos7 | gzip > ./java-1.8-centos7.tar.gz

通过docker load -i java-1.8-centos7.tar.gz加载即可

当然,还有docker exportdocker import,是针对容器操作的

8. 其他常用操作

  • docker run的各种参数 参考Docker run 命令,常用的有:
    • -d 后台运行
    • -i 交互模式
    • -t 终端
    • -p 端口映射
    • --rm 容器退出清理容器内文件
    • -v 文件挂载
    • --mount 文件挂载
  • docker start/stop/restart
  • docker inspect 查看容器或者镜像的信息
  • docker cp 容器和宿主机之间复制文件
  • docker rmi 删除镜像
  • docker rm 删除容器
  • docker commit 把容器现有状态保存为镜像,比如上面就可以在容器里编译java,编写脚本,把容器当前状态保存为镜像

9. 常用快捷操作

删除所有none的镜像

docker rmi -f $(docker images | grep "none" | awk '{print $3}')

删除所有容器

docker rm -f $(docker ps -aq)

10. 最后

上面运行的容器,在退出时都没有清理容器的文件系统
运行docker ps -a可以看到退出的容器们
可以:
通过docker rm 容器ID删除
通过docker rm -f $(docker ps -aq)删除所有容器
docker run中加上参数--rm,当然,现在来不及了

你可能感兴趣的:(Docker快速入门使用)