写到前面
给别人写的看的,顺便发出来,适合没用过快速上手的
有些解释为了说明问题,概念并不是很准确
简单了解下概念
-
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
进入容器内部:
就跟使用一个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代码的输出
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 export
和docker 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
,当然,现在来不及了