一、docker概述
首先,Docker是一种容器技术的实现,那么什么是容器呢?

容器可以在许多主流操作系统上运行,一个操作系统上可以运行多个容器,这些容器共享同一个操作系统内核。容器之间相互隔离,对软件及其依赖进行标准化打包。容器与虚拟机有什么区别呢?

容器是在应用层面进行隔离,而虚拟机是在物理资源层面进行隔离。
二、下载和安装Docker
关于Docker Desktop的安装说明,请参考在Mac上安装Docker Desktop和在Windows上安装Docker Desktop。
三、Docker镜像
Docker镜像包括Ubuntu镜像、CentOS镜像和Debian镜像,这些都是基础镜像。

Docker镜像是文件和元数据的集合,镜像是分层的,每一层可以添加或删除文件,从而形成一个新的镜像。不同的镜像可以共享相同的层,镜像本身是只读的。安装完成后启动Docker。
sudo systemctl start docker
查看Docker版本:
docker version
查看镜像列表:
sudo docker image ls
获取镜像:
在获取镜像之前,先给用户授权,输入Docker命令前不需要再加sudo。
sudo groupadd docker sudo gpasswd -a vagrant docker # 重启Docker服务 sudo service restart docker.service # 退出客户端 exit # 重连客户端 vagrant ssh # 查看Docker版本 docker version
从Docker Hub中拉取镜像,Docker Hub类似于GitHub,上面保存了各种构建后的镜像,可以通过docker pull命令直接拉取镜像。
docker pull ubuntu:14.04 docker pull bitnami/wordpress
构建一个Docker镜像:
从零构建一个镜像,首先拉取hello-world镜像并运行该镜像。
docker pull hello-world docker run hello-world
hello-world镜像运行后会打印出hello world,然后自动退出。制作一个hello-world镜像,首先准备一个.c文件。
#include<stdio.h>
int main(){
  printf("Hello,Docker;This is your first Image\n")
}接着在Docker命令行中开始制作hello-world镜像。
mkdir hello-world cd hello-world # 创建一个C文件,内容见下一个代码块 vi hello.c # 编译二进制文件 # 首先安装工具 sudo yum install gcc sudo yum install glibc-static gcc -static hello.c -o hello # 执行程序 ./hello # 创建Dockerfile,内容见Dockerfile代码块 vim Dockerfile # 构建镜像 docker build -t jingnan/hello-world . # 查看镜像 docker images # 查看镜像分层 docker history jingnan/hello-world # 运行容器 docker run jingnan/hello-world
Dockerfile内容:
FROM scratch ADD hell0 / CMD ["/hello"]
四、Docker容器
Docker容器是通过Docker镜像创建的,在镜像层上建立一个可读写的容器层。镜像负责应用的存储和分发,而容器负责运行应用。两者的关系就像面向对象中的类和实例,一个镜像可以启动多个容器,但容器名称不能相同。容器命令:
# 列举正在运行的容器,也可以使用docker ps docker container ls # 列举出所有的容器,包含已经退出的容器 docker ps -a docker container ls -a # 运行容器,运行之后会立即退出 docker run centos # 查看容器列表,不包含刚刚运行的centos docker container ls # 交互式运行容器,添加参数 -it 进入到容器中,可以在容器中进行操作 docker run -it centos # 再次查看running的容器,包含了centos docker container ls # 删除容器,可以只写部分ID docker container rm <containerid> # 删除所有容器,-q参数表示只列举出ID docker container rm $(docker ps -a -q) # 列举已经退出的容器 docker container ls -f "status=exited" -q # 删除已经退出的容器 docker rm $(docker container ls -f "status=exited" -q) # 删除镜像 docker image rm <imageid>
容器操作:停止、删除、运行
exec:exec表示对容器执行一个命令,exec /bin/bash 表示进入容器中,查看运行状态。
--name: 创建容器时,给容器一个自定义的名字。
inspect:显示容器的详细信息。
logs: 查看容器产生的日志。
# 启动容器 docker start d7 # 执行 /bin/bash,进入交互界面 docker exec -it d7 /bin/bash exit # 执行python命令,进入python shell界面 docker exec -it d7 python exit() # 执行查看ip的命令 docker exec -it d7 ip a docker stop d7 docker rm $(docker ps -a -a) # 重新创建一个新的容器,并添加--name参数,给容器一个自定义的名字 docker run -d --name=demo jingnanjia/flash-hello-world docker inspect docker logs
构建私人Docker镜像:
首先认识两个命令:
# 基于容器,做了一些改变,如安装一些软件,再创建一个新的镜像 docker container commit # 从Dockerfile build一个Image,从基础Image开始 docker container build
COMMIT实践:基于centos容器构建一个新的镜像。
docker image ls # 运行centos,并进入centos交互界面 docker run -it centos # 对centos容器做一些更改,安装vim,并退出 yum install vim exit # 将container构建成一个镜像,stupefied_hertz是容器的名字,stupefied_hertz是新镜像的名字 docker commit stupefied_hertz jingnan/centos-vim # 查看镜像构建历史 docker history jingnan/centos-vim
Dockerfile实践:
mkdir docker-centos-vim cd docker-centos-vim vim Dockerfile # 构建镜像,构建过程中会生成一个临时Container,在临时Container做了操作后再build docker build -t jingnan/centos-vim-new . # 查看镜像列表 docker images
Dockerfile内容:
FROM centos RUN yum install -y vim
Dockerfile之FROM关键字的语法:
FROM是Dockerfile最开头的语法,FROM scratch表示从0开始构建一个镜像,FROM尽量使用官方的镜像。
Dockerfile之LABEL关键字的语法:
LABEL类似代码中的注释,如:
LABEL maintainer="stark@stark-industry.com" LABEL version="mark-50" LABEL description="This is description"
Dockerfile之RUN关键字语法:
RUN表示运行一些命令,每执行一次RUN,镜像都会增加一层,如果需要执行多条命令使用&&连接两条命令,命令过长使用\换行。
RUN yum update && yum install -y vim python-dev RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
Dockerfile之WORKDIR关键字语法:
WORKDIR作用是设定当前工作目录,要尽量使用绝对目录。
WORKDIR /root WORKDIR /test # 如果没有则会自动创建
Dockerfile之ADD、COPY:
将本地文件添加到镜像文件里面,COPY由于ADD,ADD还可以解压。
ADD hello / COPY hello test/
Dockerfile之ENV:
ENV命令用来设置常量。
ENV MYSQL_VERSION 8.0
ENTRYPOINT语法实践:
mkdir cmd_vs_entrypoint cd cmd_vs_entrypoint # dockerfile内容如下 vim Dockerfile docker build -t jingnan/centos-entrypoint-shell . docker images # 运行镜像,打印出hello Docker docker run jingnan/centos-entrypoint-shell # 修改为EXEC格式 docker build -t jingnan/centos-entrypoint-exec . docker images # 打印出 hello $name docker run jingnan/centos-entrypoint-exec # 修改Dockerfile,再次build vim Dockerfile docker build -t jingnan/centos-entrypoint-exec-new . docker run jingnan/centos-entrypoint-exec-new
Shell格式的Dockerfile:
FROM centos ENV name Docker ENTRYPOINT echo "hello $name"
EXEC格式的Dockerfile,exec格式无法识别$name:
FROM centos ENV name Docker ENTRYPOINT ["/bin/echo", "hello $name"]
修改exec格式Dockerfile:
FROM centos ENV name Docker ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
五、Docker镜像发布
镜像发布实践:首先要有Docker Hub的用户名密码。
# 输入Docker Hub用户名密码 docker login # push的镜像的命名一定包含Docker Hub用户名 docker push jingnanjia/hello-world # 删除本地镜像,再从Docker Hub上拉取自己的镜像 docker rmi jingnanjia/hello-world docker pull jingnanjia/hello-world
这样发布镜像没有镜像构建构成,镜像是否安全大家都不清楚。
推荐的发布方式:分享Dockerfile。
构建一个私有的Docker Hub,没有图形界面,可以通过REST API验证镜像是否上传成功。
docker run -d -p 5000:5000 -restart always --name registry registry:2
# 构建可以上传到私有仓库的镜像,镜像tag必须是ip:port/name
docker build -t 101.133.232.238:5000/hello-world .
# 信任私有仓库配置
sudo ls /etc/docker
# { "insecure-registries":["101.133.232.238:5000"] }
vim /etc/docker/daemon.json
# 添加一行 EnvironmentFile=-etc/docker/daemon.json
sudo vim /lib/systemd/system/docker.service
sudo service docker restart
docker push 101.133.232.238:5000/hello-world成功推送到私有仓库。
以上就是From Docker to Kubernetes(一)- Image And Container的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号