以下centos7环境下安装,ubuntu见底部
开启linux内核流量转发
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
加载修改内核的参数,配置文件,按下列命令顺序进行
[root@localhost ~]# modprobe br_netfilter
[root@localhost ~]# sysctl -p /etc/sysctl.d/docker.conf
卸载旧版本,如果是新机器可以忽略这一步,因为centos还没自带docker服务。
[root@localhost ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotatedocker-selinux docker-engine-selinux docker-engine
安装依赖
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
[root@localhost ~]# yum install docker-ce
查看docker版本
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:49 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
配置docker加速器
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# touch /etc/docker/daemon.json
[root@localhost ~]# vim /etc/docker/daemon.json
#加入如下内容
{
"registry-mirrors" : [ "https://8xpk5wnt.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
}
#重启docker
[root@localhost ~]# systemctl daemon-reload && systemctl restart docker
基础命令
1、启动docker:# systemctl start docker
2、停止docker:# systemctl stop docker
3、查看docker状态:# systemctl status docker
4、开机自启动:# systemctl enable docker
5、取消开机自启动:# systemctl disable docker
docker pull 【tag】下载
例:[root@localhost ~]# docker pull mysql
指定版本下载
docker pull mysql:5.7 #指定版本必须是存在的
docker rmi 删除镜像
[root@localhost ~]# docker rmi -f (image id)或者(repository)
[root@localhost ~]# docker rmi -f $(docker images -aq) #递归删除
[root@localhost ~]# docker rmi -f 容器id 容器id 容器id #指的是删除多个容器
容器命令
先要具备容器命令先下载相应的镜像
[root@localhost ~]# docker pull ubuntu下载
新建容器完毕后
运行:
docker run [可选参数] image
#参数说明
--name="name" 容器的名字,我们自己取的名字
-d 后台方式运行
-it 使用交互方式运行
-p 指定容器的端口 -p 8080
-p 主机端口:容器端口 (常用端口)
-p 容器端口
-P 随机指定端口
测试:
[root@localhost ~]# docker run -it ubuntu /bin/bash
root@21f091ee1810:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@21f091ee1810:/# exit
exit
[root@localhost ~]#
docker ps 查看当正在运行的容器
docker ps -a 查看曾经运行过的容器随带显示历史运行的容器
docker ps -aq #-q 只显示容器的编号
退出容器
exit #直接退出容器并停止
ctrl+p+q 退出容器但不停止
删除容器
docker rm 容器id #删除指定的容器【不能删除正在运行的容器】
docker rm -f $(docker ps -aq) #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器
decker restart 容器id #重新启动容器
docker stop 容器id #停止正在运行的容器
docker skill 容器id #强制停止当前容器
后台启动 -d
[root@localhost ~]# docker run -d ubuntu
3c726a0bc6eea3545ac36b0861e102d9f5ff85a208fa712d8e3176605a691e86
[root@localhost ~]#
进入启动的容器
[root@localhost ~]# docker exec -it 371b2ae61a39 /bin/bash
root@371b2ae61a39:/#
[root@localhost ~]# docker attach 371b2ae61a39
root@371b2ae61a39:/etc#
#docker attach 371b2ae61a39 进入容器正在执行的终端,不会启动新的终端
#docker exec -it 371b2ae61a39 /bin/bash 进入容器后打开一个新的终端,可以在容器内操作
docker cp 容器id:容器内路径 目的的主机路径
[root@localhost ~]# docker cp 371b2ae61a39:/mnt/learn.txt /mnt/
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ls
learn.txt
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
[root@localhost mnt]# docker export 371b2ae61a39 >ubuntu.tar
[root@localhost mnt]# ls
learn.txt ubuntu.tar
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
[root@localhost mnt]# cat /mnt/ubuntu.tar | docker import - test/ubuntu:v1
sha256:44ab2da020dda5927104a8a5ca3b60dd33e018805493b5e544afd2775a237bf4
[root@localhost mnt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 44ab2da020dd 20 seconds ago 72.8MB
导出镜像 docker save
docker save -o a.tar centos:latest
将centos.tar.gz和nginx.tar.gz镜像包解压到/root/目录
docker load -i /root/centos.tar.gz
docker load -i /root/nginx.tar.gz
在docker 0.6版以后,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部物理机的一个普通用户权限。
使用privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。不启用privileged,容器中root用户不能执行mount。
扩展: 测试privileged 特权功能 可以:1
1. 未设置privileged启动的容器:
[root@localhost ~]# docker run -it centos:latest bash
[root@65acccbba42f /]# ls /dev #可以看到的设备文件比较少
console fd full fuse kcore null ptmx pts random shm stderr stdin stdout tty urandom zero
[root@00931099722f /]# mount -o bind /etc /opt/ #不可以挂载成功, mount命令执行失败
mount: permission denied
2. 使用privileged启动的容器
[root@xuegod63 ~]# docker run -it --privileged centos:latest bash
[root@4a51d0fde3ce /]# ls /dev/ #可以看到很多设备文件
[root@4a51d0fde3ce /]# mount -o bind /etc /opt/ #可以挂载成功
[root@4a51d0fde3ce /]# mount /dev/sda1 /opt/ #可以挂载物理机上的sda1分区
[root@4a51d0fde3ce /]# ls /opt/
[root@4a51d0fde3ce /]# init 0 #不能使用init 0关机不行,还是使用exit退出docker
Couldn't find an alternative telinit implementation to spawn.
[root@4a51d0fde3ce /]# exit
例 docker安Nginx
1.拉取镜像
[root@localhost mnt]# docker pull nginx
查看拉取
运行容器
[root@localhost mnt]# docker run -itd --name learnnginx -p 80:80 nginx
31be408acbafd65cd7d3fcf9cdfb94d237c506233c5ac878a339c37d7b8403d2
访问nginx服务
ubuntu安装
#使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
#卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc