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端口即可)