Docker安装与使用
一、docker安装。
1、安装要求:
1)docker要求服务CentOS6以上,kernel 版本必须2.6.32-431或更高
查看系统的版本和内核:
cat /etc/issue
uname -r
2)要将Docker安装到CentOS上,首先启用EPEL软件库
wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo rpm -ivh epel-release-6-8.noarch.rpm
2、安装docker
yum install docker-io
3、启动docker
service docker start
4、设置开机启动
chkconfig docker on
或
systemctl enable docker
5、将自己添加到docker群组,那样才能以非root用户的身份来运行Docker。为此,使用这个命令:
usermod -a -G docker $USER
退出,重新登录,以激活群组变更。
6、centos7安装最新版的docker
(1)首先升级一下系统包 (可以跳过)
yum update
(2)卸载旧版本的 Docker
yum erase docker docker-common docker-client docker-compose
(3)添加 Docker 的 yum 源
创建一个 /etc/yum.repos.d/docker.repo 文件,内容如下:
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
(4)安装新版本 Docker
yum install -y docker-engine
(5)安装完后设置为系统开机自动启动服务
systemctl enable docker.service
(6)启动服务
systemctl start docker
7、centos6安装新版的docker
(1)先安装1.7.1版本
#Centos6的1.7.1版本Docker在EPEL和Docker官方源提供,EPEL方便点
yum install epel-release -y
#docker-io才是1.7.1版本的,叫docker那个是1.5版本的
yum install docker-io -y
#下载1.9.1然后替换
curl -sSL -O https://get.docker.com/builds/Linux/x86_64/docker-1.9.1
chmod +x docker-1.9.1
sudo mv docker-1.9.1 /usr/bin/docker
service docker restart
(2)编译新版本
2.1)yum install git make -y
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar xzf go1.8.3.linux-amd64.tar.gz -C /usr/local
mkdir /usr/local/gopackage
2.2)vi /etc/profile
#在profile中加入下面的环境变量,PATH如果原来就有请自行合并
GOROOT=/usr/local/go
GOPATH=/usr/local/gopackage
PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOROOT GOPATH PATH
source /etc/profile
2.3)#这儿会要你输密码,直接回车就行,docker移到了moby,不过依旧不影响
git clone https://git@github.com/docker/docker
cd docker
#要啥版本你自己看着切换
git checkout v1.13.1
make build
make binary
然后会在bundles目录下生成你版本号的目录,里面有binary-client和binary-daemon目录,前者是docker文件以及它的md5和sha256文件,后者是一堆程序以及它们的md5和sha256(可以删了)
2.4)找个地方丢着然后直接运行dockerd启动daemon然后使用docker来交互就行,原有的/etc/init.d/docker文件你需要删掉了,因为无法兼容新版本的启动方式
二、基本命令
1、搜索镜像
docker search <image>
如:docker search ubuntu12.10
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mirolin/ubuntu12.10 0
marcgibbons/ubuntu12.10 0
mirolin/ubuntu12.10_redis 0
chug/ubuntu12.10x32 Ubuntu Quantal Quetzal 12.10 32bit base i... 0
chug/ubuntu12.10x64 Ubuntu Quantal Quetzal 12.10 64bit base i... 0
docker search
2、下截镜像
docker pull <image>
如:docker pull chug/ubuntu12.10x64
3、查看本地拥有的镜像
docker images: 列出images
docker images -a :列出所有的images(包含历史)
docker images --tree :显示镜像的所有层(layer)
docker rmi <image ID>: 删除一个或多个image
4、删除本地镜像
docker rmi
5、根据镜像创建并启动容器
docker run --name shell -i -t ubuntu:latest /bin/bash
5.1)参数说明:
--name:给容器的名称
-i:打开STDIN,用于控制台交互 ,表示可以interactive,可以交互
-t:打开终端,表示给容器tty终端
-d:后台运行。如果不设这个参数,容器运行完就退出
-p:端口映射:ip:port:contanter port
-v:冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
5.2)例如:
docker run -p 7000:6379 --name redis-redisbloom redislabs/rebloom:latest
BF.RESERVE bloomfilter:user:black 0.0001 10000000
BF.RESERVE {error_rate} {size}
docker run -d -p 5001:22 -p5002:80 -p5003:3306 --privileged=true -v /home/docker_data/hhht:/home/ --name centos-hhht -it centos /bin/bash
6、退出容器
exit
7、进入正在运行的docker容器
1)docker attach db3 或者 docker attach d48b21a7e439 :db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID然后就进去了这个容器的ssh界面。但是它有一个缺点,只要这个连接终止,或者使用了exit命令,容器就会退出后台运行
2)docker exec -it db3 bash 或者 docker exec -it d48b21a7e439 bash :db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID
8、停止容器
docker stop 容器id
9、启运容器
docker start 容器id
10、删除容器
docker rm
11、列出本机的容器列表
docker ps
12、使用Dockerfile创建image:
docker build -t "sloan/centos-latest:v4" .
其中-t标记添加tag,指定新的镜像的用户信息。 "."Dockerfile所有的路径。
13、修改image的tag:
docker tag e5b5df13b85e sloan/centos-latest
docker images sloan/centos-latest
14、上传镜像:
docker push sloan/centos-latest
15、保存Container到images
docker commit -a="sloan" -p=true -m="mongodb dir" e2e2e75ac08d
16、修改正在运行的容器端口映射
1)获取容器ip
docker inspect 容器名称 | grep IPAddress
2)增加端口映射
iptables -t nat -A DOCKER -p tcp --dport 主机端口 -j DNAT --to-destination 容器IP:容器端口
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
17、查看docker容器启动日志
docker logs -f -t --since="2017-05-31" --tail=10 mysql-node1
三、docker 网络设置
1、docker网络介络
Docker安装后,默认会创建下面三种网络类型
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
237ea3d5cfbf none null local
2、启动 Docker的时候,用 --network 参数,可以指定网络类型
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
3、bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
4、none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP
5、host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
6、创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下
docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.
步骤1: 创建自定义网络
docker network create --subnet=172.18.0.0/16 mynetwork
~ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
4f11ae9c85de mynetwork bridge local
237ea3d5cfbf none null local
步骤2: 创建Docker容器
docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash
docker run -itd --privileged=true -v /data/docker/data/node1:/home/ -v /data/docker/data/common:/home/common --name node1 --net mynetwork --ip 172.18.0.11 manfred/centos7-ssh /bin/bash
四、构建docker镜像
1、docker commit创建镜像
docker commit -a="sloan" -p=true -m="mongodb dir" e2e2e75ac08d
2、Dockerfile创建镜像
1)创建dockerFile文件,内容如下
#基础镜像,指构建本镜像是在哪个镜像上创建的
FROM centos
#创建镜像作者名称
MAINTAINER Rico
#添加文件到镜像中
ADD pcre-8.37.tar.gz /usr/local/src
ADD nginx-1.9.3.tar-gz /usr/local/src
#RUN 执行脚本之类的
RUN yum install -y wget gcc gcc-c++ make openssl-devel
RUN useradd -s /sbin/nologin -M www
#WORKDIR 设置操作目录,即工作目录
WORKDIR /usr/local/src/nginx-1.9.3
RUN ./configure --prefix=usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/prce-8.37 &&make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#VOLUME
VOLUME
#EXPOSE 打开端口
EXPOSE 80
ENV PATH= /usr/local/nginx/sbin;$PATH
2)构建 docker build -t mynginx:tag dockerfile
五、修改Docker默认镜像和容器的存储位置
一共四种方法可以修改docker的存储位置
1、软链接方法
1)停止docker 服务
service docker stop
2)备份数据到新的存放路径
cp -r /var/lib/docker/* /mnt/docker
3)修改备份 /var/lib/docker 路径
mv /var/lib/docker{,.bak}
4)创建软连接
ln -s /mnt/docker /var/lib/docker
5)启动docker
service docker start
2、修改镜像和容器的存放路径
指定镜像和容器存放路径的参数是--graph=/var/lib/docker,我们只需要修改配置文件指定启动参数即可。
Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,
在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS 中的位置是:/etc/sysconfig/docker。
如果是 CentOS6 则添加下面这行:
OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://
如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux):
OPTIONS=--graph="/root/data/docker" -H fd://# 或者DOCKER_OPTS="-g /root/data/docker"
最后重新启动,Docker 的路径就改成 /root/data/docker 了。
centos7下,也可以
修改docker.service文件,使用-g参数指定存储位置
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph /new-path/docker
// reload配置文件
systemctl daemon-reload
// 重启docker
systemctl restart docker.service
3、如果docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后会立即生效,不需重启docker服务。
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://7e61f7f9.m.daocloud.io"],"graph": "/new-path/docker"}
六、常用镜像
1、安装centos
1)搜索centos镜像
docker search centos
2)pull centos
docker pull centos
3)运行镜像
docker run -d -p 5001:22 -p5002:80 -p5003:3306 --privileged=true -v /home/docker_data/hhht:/home/ --name centos-hhht -it centos /bin/bash
参数说明:
--name:给容器的名称
-i:
-d:后台运行
-p:端口映射:ip:port:contanter port
-v:冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
4)退出
exit
5)重新启动容器
docker start 容器id
6)主机配置端口转发
# 将80端口的流量转发至8080
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
# 将80端口的流量转发至
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.0.1
# 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
7)安装常用工具
(A)网络配置工具
yum install -y net-tools
(B)service命令
yum install initscripts -y
8)环境变量设置
如果/etc/profile设置了环境变量再次进入容器时环境变量会失效,解决办法是将环境变量设置在
/root/.bashrc
2、安装SSH
2.1)安装
yum install passwd openssl openssh-server -y
yum install -y openssh-server* openssh-client* libmysqlclient*
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
2.2)修改SSH配置文件
vi /etc/ssh/sshd_config
RSAAuthentication yes #启用 RSA 认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径(和上面生成的文件同)
PermitRootLogin yes #root能使用ssh登录
UsePAM yes 改为 UsePAM no
UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no
2.4)
sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
2.5)开启ssh服务
/usr/sbin/sshd -D &
2.6)常见错误
(1)PTY allocation request failed on channel 0
解决: rm -rf /dev/ptmx
mknod /dev/ptmx c 5 2
好像不用以下的
chmod 666 /dev/ptmx
umount /dev/pts
rm -rf /dev/pts
mkdir /dev/pts
mount /dev/pts
3、制作镜像
docker commit ed623c6f55b9 manfred/centos7-ssh
4、安装mysql版本7以下
(1)例子一mysql版本7与8
docker run --name mysql -p 36007:3306 -e MYSQL_ROOT_PASSWORD=my-secret-p -v /data/docker/mysql/data:/var/lib/mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -d mysql
(2)例子二
docker run --name mysql-node1 --net mynetwork --ip 172.18.0.6 -e MYSQL_ROOT_PASSWORD=85595811 -v $DOCKER_RUNTIME/data/docker/data/mysql-node1/datadir:/var/lib/mysql -v $DOCKER_RUNTIME/data/docker/data/mysql-node1/conf:/etc/mysql/conf.d -d mysql
5、安装mysql5
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/LOGS:/LOGS -v $PWD/DATA:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
参数说明:
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码
七、创建私有仓库http://blog.51cto.com/welcomeweb/1698778
1、运行私有服务
docker run -d --hostname localhost --name mydocker-registry -v /app/docker/registry:/docker/images -p 5000:5000 registry
参数说明:
-v /app/docker/registry:/docker/images :将本地目录/app/docker/registry挂到私服务仓库容器/docker/images下
–privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误
2、在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
如果有这个文件就在时面加一条
{ "insecure-registries":["192.168.2.200:5000"] }
3、在/etc/sysconfig/docker修改
OPTIONS='--insecure-registry 192.168.0.179:5000' #CentOS 7系统
other_args='--insecure-registry 192.168.0.179:5000' #CentOS 6系统
4、重启docker
service docker restart #
5、推送镜像到仓库
使用tag命令修改标签
docker tag centos localhost:5000/centos
推送到仓库
docker push localhost:5000/tomcat
6、拉取镜像
docker pull 192.168.0.153:5000/busybox
7、查看仓库的镜像
http://192.168.2.200:5000/v2/_catalog
八、常用的镜像安装
1、Gitlab安装
(1)安装
sudo docker run --detach \
--hostname localhost \
--publish 1443:443 --publish 3003:3003 \
--name cn-gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab/data:/var/opt/gitlab \
twang2218/gitlab-ce-zh:latest
(2)修改端口
1 修改nginx端口
sudo vi /etc/gitlab/gitlab.rb
nginx['listen_port'] = 8088
sudo vi /var/opt/gitlab/nginx/conf/gitlab-http.conf
server {
listen *:8088;
2 修改unicorn端口(可以不修改)
sudo vi /etc/gitlab/gitlab.rb
unicorn['port'] = 8083
sudo vi /var/opt/gitlab/gitlab-rails/etc/unicorn.rb
listen "127.0.0.1:8083", :tcp_nopush => true
3 保存配置,重启。
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl status
4 ip:8088访问成功。(重启服务有延时,耐心等待一会,如果是centos可能会打不开网页,防火墙里面放开8081端口即可)