Docker安装和常用命令

Docker基础概念

Docker体系包含了宿主(host), 镜像(image), 容器(docker)这几个概念, 与虚拟机体系的区别在于, 容器只是隔离了用户空间, 而虚拟机是完全隔离.

虚拟机体系中, 宿主与虚机可以是异构的, 例如在Linux上运行Windows, 而且在Linux宿主上运行的Linux虚机, 使用的是各自的kernel

Docker体系中, 宿主机与容器是同构的, 即Linux宿主只能运行Linux的容器, 在Windows宿主上只能运行Windows的容器, 在Linux上运行的容器, 使用的是与宿主相同的kernel.

因此在容器中查看 /proc/version 看到的是宿主的kernel version, 即在18.04的宿主上, 不管你运行的是Ubuntu16, 18, 20还是Debian9, 通过 cat /proc/version 看到的永远是Ubuntu18.04的kernel. 只能通过 lsb_release -a区分. 这样带来的问题是一些有kernel依赖关系的软件, 例如一些特别旧的软件与新内核不兼容, 那么在这些新内核上运行的发行版, 就不能运行包含这些旧软件的容器.

参考: 相关的讨论链接

Docker安装

Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和Ubuntu, 可以通过添加仓库地址再通过 yum install 或 apt install安装, 也可以下载rpm包和deb包进行安装.

方式一: 通过deb包进行安装

对应Ubuntu18.04 64bit系统的deb下载地址是 https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/

Update 2018-12-18: 在版本18.09之后, docker将安装包分成了三个, container.io, docker-ce-cli 和 docker-ce, 需要依次都安装

安装完之后, 会自动在系统中添加 docker 服务

方式二: 通过apt安装

sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt install docker-ce
# check
docker version

如果不需要最新版本, 可以直接安装docker.io即可. Ubuntu20.04 at 2020.07.26 此时的docker.io版本是 19.03.8

sudo apt install docker.io

如果是在笔记本上安装, 可以禁止docker随系统自启动

sudo systemctl disable docker

设置 Registry/Mirror

设置docker的mirror, 否则build会非常慢

方法一

sudo edit /lib/systemd/system/docker.service

# 修改以下这行, 加上后面的 --registry-mirror=https://docker.mirrors.ustc.edu.cn
ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://docker.mirrors.ustc.edu.cn

方法二

编辑(不存在就创建) /etc/docker/daemon.json 添加以下内容, docker-cn.com也是国内的源. 一个暂时还可用的阿里的源 https://x9o4p9lt.mirror.aliyuncs.com/

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

将自己的用户加入docker用户组, 用id命令查看是否生效. 需要退出本ID的全部登录, 使group设置生效, 如果不生效则重启.

# 加入用户组
sudo usermod -aG docker milton
# 查看结果
getent group 
# 或者
cat /etc/group
# 查看是否生效
id

Windows10下安装docker

Windows10通过WSL增加了对Linux生态的直接支持. 安装Docker先要到Settings -> Apps -> Apps & features -> Optional features -> More Windows features 下, 勾选整个Hyper-V, 确定后Windows10会安装新组件,这个时间会比较长,需要重启。

然后从docker官网下载Docker Desktop Installer,安装后需要重启,如果没安装WSL2的话会提示安装。

设置里取消开机启动,并配置一下registry mirrors。命令行和Linux下基本一致,本地路径还是沿用windows的forward slash。

在Windows下跑Docker有一个很大的好处,就是可以完美运行各种版本服务器的命令行客户端,不需要linux跳板机直接对服务器进行操作,例如mongodump,mongorestore,直接导出到本地以及直接用本地文件进行恢复,省去了上载下载文件的步骤。

Docker Network相关命令

# 查看docker网络列表
docker network ls
 
# 查看具体网络明细
docker network inspect mybridge
 
# 创建自定义网络
docker network create --subnet=192.168.250.1/24 mybridge

Docker Image相关命令

# 查找image
docker search centos
 
# 下载image, 对已经下载的image, 再次执行pull命令时, 会检查更新并下载
docker pull centos:latest
 
# 查看image
docker image ls
docker image ls --all
 
# 删除image
docker image rm [IMAGE ID]
 
# 导出image
docker save milton-java -o docker-image-milton-java.tar
 
# 导入image (可以在其他主机上)
docker load -i docker-image-milton-java.tar 
 
# 使用Dockerfile制作image
docker build -t scot-eureka:1.0 [Dockerfile存放路径]/

注意: 制作image的过程中, 如果失败退出, 会产生一个停止的容器, 以及一个属性的image, 需要对应的用docker rm和docker image rm清理掉

从远程获取指定image所有版本的命令行

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

Docker 容器相关命令

# 用image创建容器, 使用默认的bridge网络并启动
docker run -d --name eureka -p 8762:8761 scot-eureka
docker run -d --name mongo -v /home/milton/mongo:/mongo -p 27017:27017 mongo:4
docker run -d --name mysql57 -v /home/milton/mysql57:/mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --character-set-server=utf8
 
# 用image创建容器并启动, 指定固定IP (必须使用自定义network)
docker run   -d --name redis2 --net mybridge --ip 192.168.250.2 redis:4.0.11
docker run -itd --name java8 --net mybridge --ip 192.168.250.4 java:8 /bin/bash
docker run -itd --name eureka --net mybridge --ip 192.168.250.3 scot-eureka:latest /bin/bash
 
# 查看容器
docker ps
docker ps -a
 
# 查看容器日志
docker logs -f [CONTAINER NAME]
 
# 将当前终端加入容器, 不是用-it启动的容器勿进行此操作, 否则无法用 ^P^Q退出
docker attach [CONTAINER NAME]
 
# 进入容器shell, 在容器中交互地执行命令, 用这种方式进入容器shell是比较安全的, 可以通过exit返回主机shell
docker exec -it java8 /bin/bash
 
# 启动/停止容器
docker start/stop [CONTAINER NAME]
 
# 删除容器
docker rm [CONTAINER NAME]
 
# 用容器ID创建image
docker commit -a "Milton" -m "java:8 with nano+net-tools" 8da987975c42 milton-java:8

如果是启动ubuntu这样的容器, 需要使用 -itd 参数, 如果只使用 -d, 那么因为没有跑主进程, 容器会立即退出, 例如

# 运行一个ubuntu18.04容器, 名称为ubuntu1, 将22端口映射到宿主的50001端口上, 在/ubuntu1目录挂载宿主的/home/milton/ubuntu1目录
docker run -dit --name ubuntu1 -v /home/milton/ubuntu1:/ubuntu1 -p 50001:22 ubuntu:18.04

如果只是一次性使用的容器, 需要加上--rm参数, 例如

docker run -it --rm ubuntu:16.04 bash

配置容器随着docker服务启动而自启动

# 查看容器配置
# docker inspect [container id]
# 检查里面的 RestartPolicy
docker inspect mongo
 
# 设置容器自动启动
# docker update --restart=always [container id]
# 默认为no状态, 对于always状态, 在容器被手动stop时是不会自动重启的.
docker update --restart=always mongo

Docker容器其他常用命令

# 测试运行Hello World
docker run hello-world
# 查看版本
docker --version
# 查看信息
docker info
# 登录, 回车会提示输入密码. 不登录的话, 无法下载alpine这样的image
docker login -u [username]

查看容器日志

docker logs -f container-name

按前缀停止容器

docker ps --filter name=someprefix* --filter status=running -aq | xargs docker stop

用容器名逆向得到run命令, 需要借助于 runlike

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro assaflavie/runlike api-asset-service

Docker run命令的详细参数说明

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

参数说明

-a, --attach    绑定标准输入输出 Attach to STDIN, STDOUT or STDERR (default [])
-c, --cpu-shares int     CPU的份额(相对权重, 整数)  CPU shares (relative weight)
     --cpuset-cpus       绑定容器到指定CPU运行, CPUs in which to allow execution (0-3, 0,1)
-d, --detach   后台运行容器,并返回容器ID Run container in background and print container ID
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p,  小写的P为端口映射,格式为:主机(宿主)端口:容器端口, Publish a container's port(s) to the host (default [])
-P, --publish-all 大写的P表示将所有暴露的端口随机发布 Publish all exposed ports to random ports
-m :设置容器使用内存最大值
-h, --hostname   指定容器的hostname, 例如 "mars"
-e, --env username="ritchie": 设置环境变量
     --env-file value 从指定文件读入环境变量 Read in a file of environment variables (default [])
-u, --user     用户名或UID, Username or UID (format: <name|uid>[:<group|gid>])
-v, --volume     绑定一个本地路径到容器的指定路径. 这样当容器结束后数据依然留在本地文件系统中 Bind mount a volume (default [])
--name "nginx-lb"    为容器指定一个名称, 不能与已经存在的容器重名
--ip   指定容器的IPv4地址, 必须要和 --net 合用, 只能用于自定义网络, 不能使用docker默认的bridge网络, Container IPv4 address (e.g. 172.30.100.104)
--ip6   指定容器的IPv6地址, Container IPv6 address (e.g. 2001:db8::33)
--mac-address    指定容器的MAC地址 Container MAC address (e.g. 92:d0:c6:0a:29:33)
--dns 8.8.8.8    指定容器使用的DNS服务器,默认和宿主一致
--dns-search example.com    指定容器DNS搜索域名,默认和宿主一致
--net="bridge": 指定容器的网络, 支持 bridge/host/none/container: 四种类型
--ulimit     Ulimit选项 Ulimit options (default [])
--link=[]: 添加链接到另一个容器
--expose     开放一个端口或一组端口 Expose a port or a range of ports (default [])
--rm          自动检测如果容器存在, 则将其删除 Automatically remove the container when it exits

例子

# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
# 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口
docker run -p -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
docker run -p 80:80 -v /data:/data -d nginx:latest
# 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/# 
# 生产环境中设置了环境变量的启动命令
docker run -d \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /:/host \
 -e FLUENTD_OUTPUT=elasticsearch \
 -e ELASTICSEARCH_HOST=elasticsearch \
 -e ELASTICSEARCH_PORT=9200 \
 --link=quickstart_elasticsearch_1:elasticsearch \
registry.cn-hangzhou.aliyuncs.com/acs-sample/fluentd-pilot:latest

posted on 2018-10-28 20:32  Milton  阅读(500)  评论(0编辑  收藏  举报

导航