Docker基础扫盲
文章目录
扫盲
安装
操作系统:ubuntu20
-
卸载旧版本:
sudo apt-get remove docker docker-engine docker.io containerd runc
-
更新apt和软件:
sudo apt-get update&&sudo apt-get upgrade
-
安装依赖:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
-
添加GPG密钥,官方的:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg| sudo apt-key add -
或者阿里云的:curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
-
添加软件源(amd64架构)
sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"
-
安装docker:
sudo apt install docker-ce
-
尝试建立第一个容器:
sudo docker run hello-world
-
免root :
sudo usermod -aG docker [你的用户名]
-
镜像加速:用阿里云的https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
按操作文档执行即可
镜像与容器
可以比作类与对象的关系
镜像->类
容器->对象
运行第一个docker镜像:
docker run hello-world
- docker : 当前用户未加入docker组时需要在前面加sudo,使用命令
sudo usermod -aG docker [你的用户名]
即可将免sudo运行。 - run 运行docker镜像,若在本地不存在则会从云端仓库里pull下来运行
- hello-world 镜像名
正常运行则会输出
运行交互式容器
docker run -i -t ubuntu:15.10 /bin/bash
- -t :在新容器内指定一个伪终端或终端
- -i : 允许你对容器内的标准输入 (STDIN) 进行交互
- /bin/bash :在启动的容器里执行的命令
运行成功后进入容器内的终端,尝试执行命令
利用exit即可退出容器终端
后台启动容器
尝试输入
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
或
docker run -itd --name ubuntu-test ubuntu /bin/bash
- -d 后台启动容器
- –name 指定容器名
这一长串字符串是容器ID
,对于每个容器是唯一的
查看容器列表
docker ps
类似于shell的ps命令,显示当前运行的容器
- -a :显示所有容器
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看容器的标准输出
之前后台运行了一个容器,id是f20f2b74cd3e
执行docker logs [容器ID]/[容器名称]
可以看到该容器在标准输出中输出了什么
可以看到该容器输出了一堆hello
停止容器
docker stop [容器ID]/[容器名]
容器使用
docker -h
查看所有docker命令帮助,过多
也可单独查看例如docker run --help
的命令
启动已经停止的容器
docker start [容器ID]
重启容器
docker restart [容器ID]
进入容器
在使用-d参数开启容器时默认不进入容器,可通过
docker attach [容器ID]
使用该命令如果从这个容器中退出会导致容器停止
例子:docker attach 3bdcab79f93d
或
docker exec [操作参数] [容器ID][要执行的命令]
例子:docker exec -it 3bdcab79f93d /bin/bash
导入导出容器
docker export [ID] > xxx.tar
导出容器快照到本地文件xxx.tar
从文件中导入容器快照
cat ubuntu.tar | docker import - inspiring_williamson
删除容器
docker rm -f [容器ID]
清理所有终止状态的容器
docker container prune
尝试运行一个web应用
docker pull training/webapp
docker run -d -P training/webapp python app.py
- **-d:**让容器在后台运行。
- **-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。
主机的49153端口映射到了容器的5000端口
尝试访问 主机ip:49153
可以通过修改-p的参数设置端口映射
docker run -d -p 5000:5000 training/webapp python app.py
查看端口映射
docker port [容器ID]
查看容器的进程
docker top [容器名]/[容器ID]
检查容器信息
docker inspect [容器ID]
镜像使用
管理镜像
docker images
可以列出本地的镜像列表
各个选项说明:
- **REPOSITORY:**表示镜像的仓库源
- **TAG:**镜像的标签
- **IMAGE ID:**镜像ID
- **CREATED:**镜像创建时间
- **SIZE:**镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
例如ubuntu:15.10即为15.10版本的ubuntu镜像
docker run -it ubuntu:15.10 /bin/bash
以上命令可构造一个ubuntu15.10的容器
下载镜像
docker pull [RESPOSITORY]:[TAG]
以上命令会下载镜像
搜索镜像
- 方法一:去dockerhub中搜索
- 方法二:
docker search [镜像名]
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
删除镜像
docker rmi [镜像名]/[镜像ID]
创建镜像
可以通过两种方法来更新镜像
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
方法一:
首先利用镜像建立容器,以ubuntu15.10为例
docker run -it ubuntu:15.10 /bin/bash
在建立后的容器内输入apt-get update
大概率不成功,但是不影响,退出容器
输入exit
利用docker commit
来提交镜像
例如
docker commit -m="has update" -a="mobval" dab854b01ab9 mobval/ubuntu:15v2
- -m: 提交的描述信息
- -a: 指定镜像作者
- **dab854b01ab9:**容器 ID
- mobval/ubuntu:15v2: 指定要创建的目标镜像名以及tag
构建镜像
docker build
需要创建一个dockerfile 文件来执行这个命令
Dockerfile 是一个用来构建镜像
的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
依次执行
-
mkdir dockerfile
-
cd dockerfile
-
nano Dockerfile
-
FROM centos:6.7 MAINTAINER mob "mobval@qq.com" RUN /bin/echo 'root:123456' |chpasswd RUN useradd mobval RUN /bin/echo 'mobval:123456' |chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D
-
ctrl+O保存
-
docker build -t runoob/centos:6.7 .
-
- t:指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
可以看到已经创建成功
添加镜像标签
docker tag [镜像ID] [指定的镜像标签]
可以看到存在不同tag的两个镜像
docker容器链接
端口映射
可以使用两种方式指定端口映射
- -P :是容器内部端口随机映射到主机的高端口。
- -p : 是容器内部端口绑定到指定的主机端口。
例子如下:
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
使用-p参数时还可以绑定网络地址,如
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
默认是绑定tcp端口,绑定udp端口可以这样
docker run -d -p 127.0.0.1:5002:5000/udp training/webapp python app.py
docker容器互联
创建容器时可以使用 –name对容器命名
docker run -d -P --name mobval training/webapp python app.py
新建docker网络
docker network create -d [指定的网络类型] [网络名]
-d:参数指定 Docker 网络类型,有 bridge、overlay。
例如:
docker network create -d docker network create -d bridge test
docker network ls
查看当前网络
连接容器
运行容器时使用–network [网络id]/[网络名称]即可加入该网络
docker run -itd --name test1 --network test ubuntu /bin/bash
第二个容器类似
docker run -itd --name test2 --network test ubuntu /bin/bash
进入test1
docker exec -it test1 /bin/bash
执行以下命令
apt-get update
apt install iputils-ping
尝试ping test2
可以ping通,因而容器之间可以建立连接
若是需要多个容器之间互联,可以使用docker compose
配置dns
对新建立的容器才有效
可以在主机的/etc/docker/daemon.json 文件中设置
nano /etc/docker/daemon.json
在最末尾加上
{
"dns"