Docker 基本操作

SunnyFan大约 7 分钟约 2039 字

Docker 基本操作

Docker简介

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)更重要的是容器性能开销极低。

Docker支持将软件编译成镜像;在镜像中支持各种软件配置好并发布,其他使用者可以直接使用配置好的镜像。运行中的镜像称之为容器,容器启动速度很快。类似于封装好的Windows系统,通过U盘直接安装即可,不需要进行系统配置软件

Docker的应用场景:

  • Web应用的自动化打包发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker的优点:

  • 快速、一致性的交付应用程序
  • 响应式部署和扩展
  • 充分利用虚拟机资源

Docker核心概念

Docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统中)

Docker客户端(Client):连接Docker主机进行操作;

Docker容器(Container):镜像启动后的实例,独立运行的一个或一组应用;

Docker镜像(Image):打包好的软件,用于创建Docker容器的模板;

Docker仓库(Respository):用于保存打包好的软件镜像;

关系示意图:

图

Docker的基本使用方式:

  • ① 在机器中安装Docker;
  • ② 在Docker仓库中寻找这个软件对应的镜像;
  • ③ 使用Docker运行镜像,生成一个Docker容器;
  • ④ 容器的启动或停止相当于对软件的启动和停止;

Docker的搭建

Docker版本要求

1、要求 CentOs7 系统的内核版本高于 3.10,可通过如下指令查看版本

uname -r

更新yum

安装docker ce即社区免费版,先安装必要的软件包,安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。

sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

紧接着配置一个稳定(stable)的仓库 ,仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。此处我们使用阿里云。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新Yum安装的相关Docke软件包

sudo yum makecache fast#会出错

出现如下错误:

yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)

图

更新索引的时候出错,即centos8没有该参数,解决办法为:去掉fast参数

图

查看仓库版本,并指定版本安装

查看版本

yum list docker-ce --showduplicates | sort -r

安装

yum install -y docker-ce docker-ce-cli

卸载:
yum list installed | grep docker
yum remove #移除需要卸载的组件

出现如下错误: Problem: package docker-ce-3:18.09.9-3.el7.x86_64 requires containerd.ioopen in new window >= 1.2.2-3, but none of the providers can be installed

图

根据提示,需要containerd.io的版本 >= 1.2.2-3,操作如下

也有可能出现此错误

图

解决方式yum erase podman buildah

(1)安装wget指令

yum install wget

(2)获取rpm包

wget http://docker-release-purple-prod.s3-website-us-east-1.amazonaws.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

(3)升级containerd.ioopen in new window(安装rpm包)

yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm

(4)重新安装docker-ce

yum install docker-ce

图

Doker info命令出现的问题:

执行docker info出现如下警告

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

解决办法:

vi /etc/sysctl.conf

添加以下内容

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

最后再执行

sysctl -p

=------------------------------------------------
docker not found
export DOCKER_PATH="/Applications/Docker.app/Contents/Resources/bin"
export PATH=".\$PATH:$DOCKER_PATH"

启动docker

(1)设置开机自启动

sudo systemctl start docker
sudo systemctl enable docker

(2)启动

sudo systemctl start docker

(3)验证

docker version

图

说明安装成功

或者

sudo docker ps

图

说明安装成功

(4)查看docker运行状态

systemctl status docker

图

删除docker

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

rm -rf /etc/systemd/system/docker.service.d

rm -rf /var/lib/docker

rm -rf /var/run/docker

Docker常用的命令

拉取镜像

docker pull busybox
拉取镜像慢,配置加载镜像地址
vi /etc/docker/daemon.json

# 内容=======================
“registry-mirrors”: [
“https://ebkn7ykm.mirror.aliyuncs.com",
”https://docker.mirrors.ustc.edu.cn“,
”http://f1361db2.m.daocloud.io“,
”https://registry.docker-cn.com"
]
# =============================

首次启动镜像

docker run -d --name busybox-first busybox
-d 代表后台运行容器

docker run -it --name busybox-test busybox sh

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • -p:端口。
  • -ip:指定IP。
  • -v:数据卷。例如:-v /data:/data:ro。ro为容器只读。
  • –volumes-from:数据卷来自于已有的容器。
  • -name:容器名。
  • busybox 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

启动已存在容器

docker start <容器 ID/Name>
docker restart 容器id1 [容器id2] [...]  #重启

运行的docker容器列表

docker ps # 查看正在运行的容器列表
docker ps –a # 所有容器列表(包含存活和退出容器)

停止容器

docker stop <容器 ID/Name>

进入容器

docker exec -it 容器ID/容器别名称 /bin/bash

从这个容器退出,不会导致容器的停止,推荐大家使用

查看容器的某些进程PID

doker top name

删除容器

docker rm name

镜像列表

docker images

启动所有容器

docker start $(docker ps -a -q)

复制文件到容器

docker cp sentinel.conf redis-master:/usr/local/redis

创建容器时指定IP

Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。

在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。

我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可。

查看网络模式

docker network ls

创建一个新的bridge网络

docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.1 dockercompose

查看网络信息

docker network inspect dockercompose

创建容器并指定容器ip

docker run -it --name nginx-second --network=dockercompose --ip 172.19.0.6 nginx
# 验证是否固定
docker insepect 容器ID | grep "IpAddress"
"SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.6",

创建快照

查看现有容器

docker ps/docker ps -a

###创建容器快照

docker export ID > test.tar

导入并验证

cat dd.tar | docker import - test1:latest

docker run -it ID(镜像) /bin/bash

---------------- 运行报错 ------------------
docker run 有问题

查看数据卷相关信息

docker inspect -f {{.Volumes}} 容器名

构建容器(nginx为例)

拉取镜像

docker pull centos

启动镜像

docker run --name nginx-man -it centos

安装相关依赖包

yum install -y wget gcc gcc-c++ make openssl-devel

安装nginx依赖

wget http://nginx.org/download/nginx-1.9.3.tar.gz
mv nginx-1.9.3.tar.gz /usr/local/data/nginx-1.9.3.tar.gz
cd /usr/local/data

解压

tar -zxf nginx-1.9.3.tar.gz

创建www用户

useradd -s /sbin/nologin -M www

启动nginx

./configure --prefix=/usr/local/data/nginx --user=www --group=www --with-http_ssl_moudle --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37

make

make
make install

配置启动容器直接运行nginx

vi /usr/local/data/nginx/conf/nginx.conf
#添加,让其在前台运行
daemon off;

验证

exit#退出容器
docker commit -m "my nginx" 容器ID my-nginx1:vl
doker images
#发现已经有了新镜像
docker run -it -p 92:80 my-nginx1:v1 /usr/local/data/nginx/sbin/nginx
#可以循环添加想要的容器数量
在浏览器打开IP:92
可以看到nginx

容器自启

docker container update --restart=always 容器名

附录:

Gitlab安装

docker pull twang2218/gitlab-ce-zh

version: '3'
services:
   web:
     image: 'twang2218/gitlab-ce-zh'   #gitlab镜像
     restart: always
     privileged: true  #权限
     hostname: '192.168.3.249'       #主机名,即虚拟机的ip
     environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
            external_url 'http://192.168.3.249' #主机名,即虚拟机的ip
            gitlab_rails['gitlab_shell_ssh_port'] = 2222
            unicorn['port'] = 8888
            nginx['listen_port'] = 8084
     ports:
        - '8084:8084'
        - '8443:443'
        - '2222:22'
     volumes:
        - './config:/etc/gitlab'
        - './logs:/var/log/gitlab'
        - './data:/var/opt/gitlab'