docker(容器技术的一种实现) 我们经常会使用docker构造虚拟化环境,docker自动化部署已经慢慢成为发展的趋势。本人介绍下docker的基本使用,本人linux发行版本为centos7.4
基本概念
使用docker接触最多的就是以下3个概念,
- 镜像:image (理解成打包好的代码)
- 容器:container(跑代码的环境 例如lnmp)
- 仓库:repository(代码仓库git)
docker的安装
# 卸载原来的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖
yum update -y && sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 添加官方yum库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce docker-ce-cli containerd.io
# 查看docker版本
docker --version
# 开机启动
systemctl enable --now docker
理解下Dockerfile
Dockerfile是一个文本文件,它包含了一些指令,docker镜像的构建就是通过Dockerfile中的这一条一条的指令完成的。也就是说,要构建一个镜像,就需要一个Dockerfile,然后根据自己的需求配置一些指令集合,下面就看一下Dockerfile中使用的一些指令。
基本命令
-
FROM:指定基础镜像
定制我们的镜像,是需要以一个镜像为基础的,就是基础镜像,例如Ubuntu、 nginx、postgres、mysql等,例如,FROM Ubuntu:16.04,如果本地有Ubuntu基础镜像则使用本地基础镜像,如果没有则会到官方镜像仓库拉取,16.04是镜像版本号,如果不指定则会拉取lastest。
-
RUN:执行命令
RUN指定我们在构建镜像时需要执行的命令,比如apt-get install安装某个软件,pip install安装Python依赖包,配置软件源,配置时区等, 例如,RUN apt-get install python3。
-
ADD和COPY:文件操作
ADD和COPY是两个功能类似的指令,一般优先使用COPY,它比ADD更透明,它的功能是将本地文件拷贝到容器中,例如,COPY ./ /home/jackpop/test。
-
WORKDIR:指定工作路径
指定镜像的运行时的工作路径,例如,WORKDIR /home/jackpop/test 。
-
ENTRYPOINT:设置镜像主命令
指定镜像运行是运行的命令,例如, ENTRYPOINT ["python", "-m", "main"]。
-
LABEL:添加标签
可以为镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。
-
CMD:执行目标镜像中包含的软件
如果创建镜像的目的是为了部署某个服务,可能会执行某种形式的命令,可以包含参数。
-
EXPOSE:指定监听端口
给外部访问指定访问端口。
-
ENV:环境变量
为了方面程序运行,有时需要更新环境变量。
-
VOLUME:暴露数据库存储文件
-
USER:指定当前用户
其中常用的命令就是FROM、COPY、WORKDIR、RUN、ENTRYPOINT
查看下本地镜像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4e2eef94cd6b 2 weeks ago 73.9MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
查看本地容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5337e4b0075 ubuntu "/bin/bash" 9 days ago Exited (0) 9 days ago happy_diffie
eea560bed5b8 hello-world "/hello" 9 days ago Exited (0) 9 days ago
启动、停止、重启容器
#docker start $container_id 启动容器
docker start d5337e4b0075
d5337e4b0075
[root@izuf69nj83ng3r7vgh9pmhz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5337e4b0075 ubuntu "/bin/bash" 9 days ago Up 8 seconds happy_diffie
eea560bed5b8 hello-world "/hello" 9 days ago Exited (0) 9 days ago cranky_edison
#可以看到容器id的status 是Up 8 seconds
#docker stop $container_id 停止容器
ocker stop d5337e4b0075
d5337e4b0075
[root@izuf69nj83ng3r7vgh9pmhz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5337e4b0075 ubuntu "/bin/bash" 9 days ago Exited (0) 4 seconds ago happy_diffie
eea560bed5b8 hello-world "/hello" 9 days ago Exited (0) 9 days ago cranky_edison
#可以看到容器的状态是退出的
# docker restart $container_id 重启容器 这里不做演示了
镜像常用命令
#退出和进入镜像
exit
docker exec $container_id /bin/bash
#启动镜像
docker run $image_id
#拉取镜像
docker image pull ubuntu
#从Dockerfile创建镜像
docker build
#从一个修改的容器创建镜像 这个有点像git修改后 commit
docker commit
#容器与本地之间复制文件
docker cp
#将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
#推送镜像
docker push
# 为镜像打标签
docker tag
#将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。
docker tag ubuntu:15.10 runoob/ubuntu:v3
#重命名容器 docker rename 原容器名称 新容器名称
docker rename
#删除容器
docker rm
#删除镜像
docker rmi
#搜索镜像
docker search
开始构建自定义镜像
创建一个目录,里面包含Dockerfile main.py
[root@izuf69nj83ng3r7vgh9pmhz dockertest]# ls
Dockerfile main.py
Dockerfile内容
FROM ubuntu
COPY ./ /home/Test
WORKDIR /home/Test
RUN apt-get update && apt-get install -y python3 python3-pip \
&& ln -s pip3 /usr/bin/pip \
&& ln -sf /usr/bin/python3 /usr/bin/python \
&& python /home/Test/main.py
main.py内容
from time import sleep
def main():
for i in range(18):
print(i)
sleep(1)
if __name__ == '__main__':
main()
开始构建
docker build -t demopys:v1.0 .
#查看镜像列表 demopys 就是你刚构建的镜像标签
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demopys v1.0 22bba38a326c 47 seconds ago 390MB
我们启动一个容器 装载我们刚构建的镜像 并且进入到该容器,在容器内执行/bin/bash命令
[root@izuf69nj83ng3r7vgh9pmhz dockertest]# docker run -it 22bba38a326c /bin/bash
root@672b16e697d5:/home/Test# ls
Dockerfile main.py
docker的基本知识就这么多了,后续会更新容器仓库,容器编排等相关知识