一文带你了解并学会使用Docker(一)
今天听了一次Docker简介,感觉通俗易懂,很值得记录下来。适合小白的入门,让我们带着问题出发吧。
什么是Docker
官方:
Docker is an open platform for developing, shipping, and running applications.
Docker allows you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications.
By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
You can download and install Docker on multiple platforms. Refer to the following section and choose the best installation path for you.
//翻译
Docker可以将您的代码和环境进行分离。达到一个快速部署、测试、发布的需求。(博主个人理解)
举个栗子:
- 小帅和小美在同一家公司上班,并且他们维护的是同一个项目(比如Android)。刚入职时,小帅和小美便信心满满的开始拉代码,部署环境🐧。
- 小帅一上午便部署好了本地环境,然而小美还没部署好,于是小美就去请教小帅部署过程中遇到的问题,小帅把部署文档发给小美之后便开始工作。小美按照文档一步一步来,但最终还是没有解决问题。就在小美疑惑的时候,小帅一眼就看出问题所在:“你这个环境时ubuntu20啊,我本地环境时ubuntu18,你要不试试这个环境?”。好家伙,这一下把小美懵圈了,那我不都得重新再来一遍?😭
- 当两人都愁眉苦脸时,小黑(大神🎉)出场了,直接粘贴一个tar包,来了一手load,代码成功编译通过,就是这么强👍。
- 为什么小黑只凭一个tar包就能解决问题呢?这便是Docker的魅力了。
- 我们可以把Docker理解为一个依赖环境,你只需要负责修改代码,环境大家都用同一个,这样就能保证大家的代码都能编译通过。
了解Docker
先了解几个名词
Info | Description |
---|---|
Container | 容器:可以看做是类的实例化对象 |
Image | 镜像:你可以把它看成Java中的类 |
Container
- Docker 利用容器(Container)独立运行的一个或一组应用。
容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
Image
- Docker镜像(Image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建多个容器。容器与镜像的关系就类似于Java面向对象类与对象的关系,镜像为类,对象为容器,通过类创建对象,通过镜像创建容器。
安装Docker(CentOS为例)
- 官方:https://docs.docker.com/engine/install/centos/
前提 当前用户具有权限 不然后边会打印Warning
# Uninstall any such older versions before attempting to install a new version, along with associated dependencies.
# 先删除
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 配置资源管理包
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker Engine, containerd, and Docker Compose: -> Compose好用
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动docker engine
systemctl start docker.service
#将docker服务加入开机自启项
systemctl enable docker.service
#安装docker compose
yum install docker-compose-plugin
#配置docker镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ilksipxb.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
基本命令
Code | Description |
---|---|
systemctl enable docker | 安装好docker后,设置开机启动。 |
service docker restart | docker重启 |
service docker start | docker启动 |
service docker stop | docker停止 |
docker search java | 查找镜像java |
docker pull java | 拉取镜像 |
docker push | 推送本地镜像到服务器 |
docker images | 列出镜像 |
docker images -a | 列出所有的images(包含历史) |
docker images --tree | 显示镜像的所有层(layer) |
docker rmi <image ID> | 删除一个或多个image |
docker ps | 查看运行容器 |
docker ps -a | 查看所有容器 |
docker start <ContainerId(或者name)> | 启动容器 |
docker stop <ContainerId(或者name)> | 停止容器 |
docker restart <ContainerId(或者name)> | 重启容器 |
docker rm <ContainerId(或者name)> | 删除容器 |
docker rm $(docker ps -a -q) | 删除全部容器 |
Docker 启动容器(run)
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 标准输入输出流和错误信息(必须是以非docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
Docker进入容器
docker exec -it containerID /bin/bash
容器转为镜像
(1)容器转为镜像
docker commit 容器id 镜像名称:版本号
(2)转为压缩文件,可进行分享
docker save -o 压缩文件名称 镜像名称:版本号
(3)解压为镜像,其他人就可用了
docker load -i 压缩文件名称
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本文链接:https://www.blog.ycisch.com/archives/734.html