Docker学习笔记-概念和常见命令
Docker架构
Docker包括三个基本概念:
镜像(image):docker镜像就相当于一个root文件系统。比如:官方镜像ubuntu16.04就包含了完整的一套ubuntu16.04最小系统的root文件系统。
容器(container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。
docker使用客户端-服务端(C/S)架构模式,使用远程API来管理和创建Docker容器。
docker容器通过docker镜像来创建。
Docker安装
在ubuntu下按照docker软件
官方安装脚本自动安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -sSL https://get.daocloud.io/docker | sh
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。
Docker使用
docker hello world
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
docker:Docker的二进制执行文件
run:与前面的docker组合来运行一个容器
ubuntu:15.10 指定要运行的镜像,docker首先从本地主机上查找镜像是否存在,不存在,docker就会从镜像仓库docker hub下载公共镜像。
/bin/echo “hello world”:在启动的容器里执行的命令
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
运行交互式的容器
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入进行交互。
exit或者ctrl+d 退出容器
启动容器(后台模式)
-d:后台运行模式 docker run -d
runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63 #容器id 唯一的
查看是否有容器运行:docker ps
runoob@runoob:~$ docker ps # 查看容器运行
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看容器内的标准输出 docker logs
runoob@runoob:~$ docker logs 2b1b7a428627 # 容器id 12个字节
runoob@runoob:~$ docker logs amazing_cori # 容器名称
停止容器 docker stop
runoob@runoob:~$ docker stop 2b1b7a428627 # 容器id 12个字节
runoob@runoob:~$ docker stop amazing_cori # 容器名称
Docker容器使用
获取镜像:docker pull ubuntu
启动容器:docker run -it ubuntu /bin/bash
退出容器终端:exit
启动已停止运行的容器: docker ps -a
docker start b750bbbcfd88 (容器的id)
后台运行: -d指定运行模式,参数默认不会进入容器
docker run -itd --name ubuntu-test ubuntu /bin/bash
停止的容器启动: docker start 《id、名字》
停止一个容器: docker stop <容器 ID>
正在运行的容器重启: docker restart <容器 ID>
进入容器: docker attach(不推荐使用,用了exit,退出容器会停止容器)
docker exec (推荐使用,退出容器终端不会导致容器停止)
导出容器: docker export 容器 ID > xxx.tar
docker export 1e560fca3906 > ubuntu.tar
导入容器: docker import 从容器快照文件中再导入为镜像
docker/ubuntu.tar | docker import - test/ubuntu:v1 #v1是版本号
docker import http://example.com/exampleimage.tgz example/imagerepo #通过指定 URL 或者某个目录来导入
删除容器: docker rm -f 1e560fca3906
docker container prune # 清理所有处于终止状态的容器
运行一个web应用:
runoob@runoob:~# docker pull training/webapp # 载入镜像
runoob@runoob:~# docker run -d -P training/webapp python app.py
-d: 后台运行 -P:将容器内部使用的网络端口随机映射到我们使用的主机上
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
docker容器开了5000端口,映射到主机端口的32769上
通过 -p参数设置不一样的端口(5000:5000)
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
容器内部的 5000 端口映射到我们本地主机的 5000 端口上
runoob@runoob:~# docker ps
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
快捷查看网络端口: docker port bf08b7f2cd89
docker port wizardly_chandrasekhar
查看容器内部标准输出: docker logs -f bf08b7f2cd89
查看容器内部运行的进程: docker top wizardly_chandrasekhar
查看docker的底层信息: docker inspect wizardly_chandrasekhar #记录着 Docker 容器的配置和状态信息
移除一个容器: docker rm (id\name) #容器必须是处于停止状态下
ps:解决docker权限问题,选择方法2。
方法1: 使用sudo获取管理员权限,运行docker命令
方法2: 创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
Docker镜像使用
管理和使用本地docker主机的镜像
列出镜像列表:docker images
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
获取新镜像: docker pull ubuntu:13.10
查找镜像: docker search httpd ( https://hub.docker.com/ 网站查找)
删除镜像: docker rmi hello-world
https://www.runoob.com/docker/docker-image-usage.html
创建镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
(可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)
2、使用 Dockerfile 指令来创建一个新的镜像
创建dockerfile文件,包含一组指令告诉docker如何构建我们的镜像
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
RUN 指令告诉docker 在镜像内执行命令,安装了什么
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
(所有者、所属组和其他人)
设置镜像标签
docker tag添加一个新的标签
runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
容器连接
# 默认是tcp
runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
# 指定是udp端口
runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
6779686f06f6 training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5000->5000/udp drunk_visvesvaraya
95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker
33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik
fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
查看绑定情况
runoob@runoob:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001
容器命名: 使用 –name 标识来命名容器
runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
新建网络
创建新docker网络
$ docker network create -d bridge test-net
docker network ls ---------查看docker网络
-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
运行一个容器并连接到新建的 test-net 网络:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
运行了两个容器,test1和test2.
下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
$ ping test1
$ ping test2
DNS:域名系统
仓库管理
仓库(Repository)是集中存放镜像的地方。
在 https://hub.docker.com 免费注册一个 Docker 账号。
登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
$ docker login
$ docker logout
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。
$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image lsREPOSITORY TAG IMAGE ID CREATED ...
ubuntu 18.04 275d79972a86 6 days ago ...
username/ubuntu 18.04 275d79972a86 6 days ago ...
$ docker push username/ubuntu:18.04
$ docker search username/ubuntuNAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu
DockerFile
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz
指令详解
copy
从上下文目录中复制文件或者目录到容器里指定路径。
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
FROM- 镜像从那里来
MAINTAINER- 镜像维护者信息
RUN- 构建镜像执行的命令,每一次RUN都会构建一层
CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
VOLUME- 定义数据卷,如果没有定义则使用默认
USER- 指定后续执行的用户组和用户
WORKDIR- 切换当前执行的工作目录
HEALTHCHECH- 健康检测指令
ARG- 变量属性值,但不在容器内部起作用
EXPOSE- 暴露端口
ENV- 变量属性值,容器内部也会起作用
ADD- 添加文件,如果是压缩文件也解压
COPY- 添加文件,以复制的形式
ENTRYPOINT- 容器进入时执行的命令
Docker学习笔记-概念和常见命令相关推荐
- anaconda中安装xgboost_ML学习笔记之Anaconda中命令形式安装XGBoost(pip install)
0x00 概述 在没有安装XGBoost之前,import xgboot会出错,如下: # ModuleNotFoundError: No module named 'xgboost' 0x01 安装 ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- docker学习笔记(二)docker常用命令
参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(三)镜像 docker学习笔记(四)使用docker搭建环境 docker学习 ...
- 狂神 Docker学习笔记 从基础到进阶 一步到位
Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...
- 开源的容器虚拟化平台Docker学习笔记,个人私藏分享,不谢!
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- Docker 学习笔记 - 进阶四 Docker网络和 Docker compose
Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...
- Docker学习笔记01
Docker学习笔记01 Docker学习 Docker的概述 Docker的安装 Docker的命令 镜像命令 容器命令 操作命令 ... Docker镜像 容器数据卷 DockerFile Doc ...
- Docker学习笔记总结
pdf版本笔记的下载地址: Docker学习笔记01(访问密码:3834) Docker学习笔记总结 Docker的安装 Docker的基本组成 Docker的安装 演示系统环境 安装步骤 配置阿里云 ...
- 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...
最新文章
- 浅议数据中心规划设计阶段暖通系统节能措施
- 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
- java 数组 参数 ppt,Java自学课件-数组.ppt
- NOI.AC#2007-light【根号分治】
- “一休数学思维”改名“海豚思维”,并完成数千万元Pre-A轮融资
- HTML-CSS线性渐变
- Flume1.6.0之Error-protobuf-This is supposed to be overridden by subclasses
- 剑指Offer28.对称的二叉树
- 华为路由器虚拟服务器怎么设置方法,华为路由器PPPoE配置案例-华为路由器设置...
- Juniper SRX密码恢复
- 磁盘清理 磁盘分析 磁盘空间 磁盘大小 可视化【软件】
- Ubuntu 16.04 安装并创建快捷图标 XMind
- 《庄子·杂篇·庚桑楚第二十三》
- 《计算广告》学习笔记(二)
- 手指静脉图像分类识别
- Javalin:一个轻量的 Web Framework
- iptables防火墙和firewalld防火墙
- IAAS基于开源openstack框架搭建云计算平台和各组件基础搭建内容包括mysql、keyston、Glance、Nova、Neutron、Dashboard、Heat、Trove等
- 《计算机网络自顶向下》Wireshark实验 Lab11 802.11 WiFi
- ruby 中的respond_to (转)
热门文章
- 进行移动_德勤预测2019年初中国有6亿人使用手机进行移动支付
- Python爬虫笔记之用BeautifulSoup及requests库爬取
- 大型游戏服务器架构该怎么设计?
- .html是什么方法,关于html:HTTP方法的默认形式是什么?
- [转]思科与华为之战:数据通信市场面临裂变
- 同步和串行的区别_谈谈SPI (Serial Peripheral Interface,串行外设接口)
- 晶振,机器频率和脉冲(时钟周期)
- 一体机联想键盘如何关闭Fn功能键恢复F1~F12
- 苹果6换屏多钱_iPhone 12系列官方换屏要多少钱?苹果给出答案
- 投票|微信投票如何刷投票数的方法和步骤【禁止非法使用】